/ Hex Artifact Content
Login

Artifact ccc62c39af1e6340f6af36fcf68efb96482d4c3a:


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 74 68 65  /*.** Return the
0690: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
06a0: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
06b0: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  o in order to co
06c0: 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69  ntinue.** immedi
06d0: 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e  ately with the n
06e0: 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45  ext row of a WHE
06f0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  RE clause..*/.in
0700: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  t sqlite3WhereCo
0710: 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72  ntinueLabel(Wher
0720: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0730: 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
0740: 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ->iContinue!=0 )
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
0760: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
0770: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0780: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
0790: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
07a0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
07b0: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
07c0: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
07d0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
07e0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
07f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0800: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0810: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
0820: 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f   Return ONEPASS_
0830: 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50  OFF (0) if an UP
0840: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
0850: 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62  tatement is unab
0860: 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65  le to.** operate
0870: 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
0880: 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20   rowis returned 
0890: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
08a0: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e  e.  Return.** ON
08b0: 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29  EPASS_SINGLE (1)
08c0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
08d0: 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  t can operation 
08e0: 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65  directly because
08f0: 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c   only.** a singl
0900: 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63  e row is to be c
0910: 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20  hanged.  Return 
0920: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32  ONEPASS_MULTI (2
0930: 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73  ) if the one-pas
0940: 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s.** optimizatio
0950: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e  n can be used on
0960: 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a   multiple .**.**
0970: 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20   If the ONEPASS 
0980: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
0990: 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f  used (if this ro
09a0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
09b0: 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f  ue).** then also
09c0: 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63   write the indic
09d0: 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f  es of open curso
09e0: 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41  rs used by ONEPA
09f0: 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72  SS.** into aiCur
0a00: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0a10: 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73  .  iaCur[0] gets
0a20: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   the cursor of t
0a30: 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65  he data.** table
0a40: 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65   and iaCur[1] ge
0a50: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  ts the cursor us
0a60: 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61  ed by an auxilia
0a70: 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74  ry index..** Eit
0a80: 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65  her value may be
0a90: 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
0aa0: 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e  that cursor is n
0ab0: 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20  ot used..** Any 
0ac0: 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64  cursors returned
0ad0: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
0ae0: 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
0af0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b  ng..**.** aiCur[
0b00: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20  0] and aiCur[1] 
0b10: 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74  both get -1 if t
0b20: 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20  he where-clause 
0b30: 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62  logic is.** unab
0b40: 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e  le to use the ON
0b50: 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
0b60: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
0b70: 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73  e3WhereOkOnePass
0b80: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0b90: 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b  fo, int *aiCur){
0ba0: 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c  .  memcpy(aiCur,
0bb0: 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
0bc0: 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e  ePass, sizeof(in
0bd0: 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48  t)*2);.#ifdef WH
0be0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
0bf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
0c00: 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e  ereTrace && pWIn
0c10: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
0c20: 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
0c30: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0c40: 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a  ntf("%s cursors:
0c50: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
0c60: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
0c70: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49  Pass==ONEPASS_SI
0c80: 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f  NGLE ? "ONEPASS_
0c90: 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41  SINGLE" : "ONEPA
0ca0: 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20  SS_MULTI",.     
0cb0: 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69      aiCur[0], ai
0cc0: 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e  Cur[1]);.  }.#en
0cd0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49  dif.  return pWI
0ce0: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d  nfo->eOnePass;.}
0cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
0d00: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63   content of pSrc
0d10: 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73   into pDest.*/.s
0d20: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
0d30: 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65  OrMove(WhereOrSe
0d40: 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f  t *pDest, WhereO
0d50: 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70  rSet *pSrc){.  p
0d60: 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e  Dest->n = pSrc->
0d70: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73  n;.  memcpy(pDes
0d80: 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70  t->a, pSrc->a, p
0d90: 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70  Dest->n*sizeof(p
0da0: 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a  Dest->a[0]));.}.
0db0: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e  ./*.** Try to in
0dc0: 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65  sert a new prere
0dd0: 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74  quisite/cost ent
0de0: 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  ry into the Wher
0df0: 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a  eOrSet pSet..**.
0e00: 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79  ** The new entry
0e10: 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
0e20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
0e30: 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
0e40: 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20  be.** appended, 
0e50: 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  or it might be d
0e60: 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68  iscarded.  Do wh
0e70: 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69  atever is the ri
0e80: 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20  ght thing.** so 
0e90: 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20  that pSet keeps 
0ea0: 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65  the N_OR_COST be
0eb0: 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20  st entries seen 
0ec0: 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69  so far..*/.stati
0ed0: 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73  c int whereOrIns
0ee0: 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65  ert(.  WhereOrSe
0ef0: 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a  t *pSet,      /*
0f00: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
0f10: 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f  to be updated */
0f20: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
0f30: 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  q,        /* Pre
0f40: 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68  requisites of th
0f50: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  e new entry */. 
0f60: 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20   LogEst rRun,   
0f70: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63          /* Run-c
0f80: 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65  ost of the new e
0f90: 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ntry */.  LogEst
0fa0: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20   nOut           
0fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
0fc0: 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65  tputs for the ne
0fd0: 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20  w entry */.){.  
0fe0: 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72  u16 i;.  WhereOr
0ff0: 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69  Cost *p;.  for(i
1000: 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74  =pSet->n, p=pSet
1010: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1020: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75  ++){.    if( rRu
1030: 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70  n<=p->rRun && (p
1040: 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65  rereq & p->prere
1050: 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20  q)==prereq ){.  
1060: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72      goto whereOr
1070: 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20  Insert_done;.   
1080: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1090: 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e  un<=rRun && (p->
10a0: 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29  prereq & prereq)
10b0: 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ==p->prereq ){. 
10c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10e0: 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54  Set->n<N_OR_COST
10f0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65   ){.    p = &pSe
1100: 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b  t->a[pSet->n++];
1110: 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  .    p->nOut = n
1120: 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Out;.  }else{.  
1130: 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20    p = pSet->a;. 
1140: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53     for(i=1; i<pS
1150: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1160: 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70     if( p->rRun>p
1170: 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29  Set->a[i].rRun )
1180: 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69   p = pSet->a + i
1190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11a0: 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20  p->rRun<=rRun ) 
11b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68  return 0;.  }.wh
11c0: 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65  ereOrInsert_done
11d0: 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20  :.  p->prereq = 
11e0: 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75  prereq;.  p->rRu
11f0: 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20  n = rRun;.  if( 
1200: 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70  p->nOut>nOut ) p
1210: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
1220: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1230: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
1240: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
1250: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
1260: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
1270: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
1280: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
1290: 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65  /.Bitmask sqlite
12a0: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68  3WhereGetMask(Wh
12b0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
12c0: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
12d0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
12e0: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
12f0: 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  >n<=(int)sizeof(
1300: 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  Bitmask)*8 );.  
1310: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
1320: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1330: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
1340: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
1350: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d  {.      return M
1360: 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
1370: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1390: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
13a0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
13b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
13c0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
13d0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
13e0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
13f0: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
1400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1410: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
1420: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
1430: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
1440: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
1450: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
1460: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
1470: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
1480: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
1490: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
14a0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
14b0: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
14c0: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
14d0: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
14e0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
14f0: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
1500: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
1510: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
1520: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
1530: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  or;.}../*.** Adv
1540: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1550: 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20   WhereTerm that 
1560: 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e  matches accordin
1570: 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69  g to the criteri
1580: 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64  a.** established
1590: 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20   when the pScan 
15a0: 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69  object was initi
15b0: 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53  alized by whereS
15c0: 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65  canInit()..** Re
15d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
15e0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d  re are no more m
15f0: 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72  atching WhereTer
1600: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  ms..*/.static Wh
1610: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
1620: 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e  anNext(WhereScan
1630: 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20   *pScan){.  int 
1640: 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1650: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
1660: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
1670: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69   term */.  i16 i
1680: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1690: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e  /* The column on
16a0: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16b0: 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50  term.  -1 for IP
16c0: 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b  K */.  Expr *pX;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  n expression bei
16f0: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57  ng tested */.  W
1700: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1710: 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64      /* Shorthand
1720: 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20   for pScan->pWC 
1730: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1740: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65  pTerm;    /* The
1750: 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74   term being test
1760: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20  ed */.  int k = 
1770: 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20  pScan->k;    /* 
1780: 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73  Where to start s
1790: 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68  canning */..  wh
17a0: 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ile( pScan->iEqu
17b0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
17c0: 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20  v ){.    iCur = 
17d0: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
17e0: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
17f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63     iColumn = pSc
1800: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53 63  an->aiColumn[pSc
1810: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1820: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
1830: 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61 6e  XN_EXPR && pScan
1840: 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29 20  ->pIdxExpr==0 ) 
1850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
1860: 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61  ile( (pWC = pSca
1870: 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20  n->pWC)!=0 ){.  
1880: 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1890: 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e  C->a+k; k<pWC->n
18a0: 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d  Term; k++, pTerm
18b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18c0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
18d0: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
18e0: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
18f0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
1900: 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69  n.         && (i
1910: 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a  Column!=XN_EXPR.
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1930: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1940: 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  re(pTerm->pExpr-
1950: 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70 49  >pLeft,pScan->pI
1960: 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29  dxExpr,iCur)==0)
1970: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
1980: 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c  can->iEquiv<=1 |
1990: 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
19a0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
19b0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
19c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
19d0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
19f0: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
1a00: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
1a10: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
1a20: 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20  Scan->aiCur).   
1a30: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d          && (pX =
1a40: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1a50: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
1a60: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
1a70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
1a80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1a90: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
1aa0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1ab0: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
1ac0: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
1ad0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
1ae0: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
1af0: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
1b00: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
1b10: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
1b20: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b70: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
1b80: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
1b90: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
1ba0: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
1bb0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1bc0: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
1bd0: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
1be0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
1bf0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
1c00: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1c10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c20: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1c30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
1c40: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
1c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c60: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
1c70: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
1c80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
1c90: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
1ca0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
1cb0: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
1cc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1cd0: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
1cf0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
1d10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
1d20: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1d40: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d60: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
1d70: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
1d80: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
1d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dd0: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
1de0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
1df0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1e00: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1e10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
1e50: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e70: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
1e80: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1e90: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1eb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ec0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
1ed0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f20: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1f30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1f40: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1f60: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1f70: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
1f80: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1f90: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
1fa0: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
1fb0: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
1fc0: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
1fd0: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
1fe0: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
1ff0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2000: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2010: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2020: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
2030: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2050: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
2060: 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20  ->k = k+1;.     
2070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
2080: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
2090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a0: 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e   }.      pScan->
20b0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
20c0: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
20d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  k = 0;.    }.   
20e0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
20f0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20  can->pOrigWC;.  
2100: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63    k = 0;.    pSc
2110: 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20  an->iEquiv++;.  
2120: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2130: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2140: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2150: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
2160: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2170: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
2180: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
2190: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
21a0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
21b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
21c0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
21d0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
21e0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
21f0: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
2200: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2210: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2220: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
2230: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
2240: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
2250: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
2260: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
2270: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
2280: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
2290: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
22a0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
22b0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
22c0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
22d0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
22e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
22f0: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
2300: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2310: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
2320: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
2330: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
2340: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
2350: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
2360: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
2370: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
2380: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
2390: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
23a0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
23b0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
23c0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
23d0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
23e0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
23f0: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
2400: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
2410: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
2420: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
2430: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
2440: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
2450: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2460: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2470: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
2480: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2490: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
24a0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
24b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
24c0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
24d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24f0: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
2500: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
2510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2520: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
2530: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
2540: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2550: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2560: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
2570: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
2580: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 0a  {.  int j = 0;..
2590: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
25a0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
25b0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
25c0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
25d0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
25e0: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
25f0: 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20 69  IdxExpr = 0;.  i
2600: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 6a  f( pIdx ){.    j
2610: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = iColumn;.    
2620: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
2630: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2640: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
2650: 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e 70  _EXPR ) pScan->p
2660: 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  IdxExpr = pIdx->
2670: 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
2680: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
2690: 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e  pIdx && iColumn>
26a0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  =0 ){.    pScan-
26b0: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
26c0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
26d0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
26e0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
26f0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
2700: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
2710: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
2720: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
2730: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
2740: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
2750: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
2760: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
2770: 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30    pScan->aiCur[0
2780: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
2790: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d  n->aiColumn[0] =
27a0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
27b0: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->nEquiv = 1;. 
27c0: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
27d0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   1;.  return whe
27e0: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
27f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
2800: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
2810: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2820: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
2830: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2840: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
2850: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2860: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
2870: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
2880: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
2890: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
28a0: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
28b0: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
28c0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
28d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28e0: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
28f0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
2900: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64  nd..**.** If pId
2910: 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63 68  x!=0 then search
2920: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2930: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2940: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2950: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2960: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2970: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2980: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2990: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
29a0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
29b0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
29c0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
29d0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
29e0: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
29f0: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2a00: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2a10: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2a20: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2a30: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2a40: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2a50: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2a60: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2a70: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2a80: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2a90: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2aa0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2ab0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2ac0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2ad0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2ae0: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2af0: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2b00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2b10: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2b20: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2b30: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2b40: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2b50: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2b60: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2b70: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2b80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2b90: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ba0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2bb0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2bd0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2be0: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2bf0: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2c00: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2c10: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2c20: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2c30: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2c40: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2c50: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2c60: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2c70: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2c80: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2c90: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2ca0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2cb0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2cc0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2cd0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
2ce0: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
2cf0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
2d00: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
2d10: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
2d20: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
2d30: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
2d40: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
2d50: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
2d60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2d70: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
2d80: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2d90: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
2da0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
2db0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2dc0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
2dd0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2df0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
2e00: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2e10: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
2e20: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
2e30: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
2e40: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
2e70: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
2e80: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
2e90: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2ea0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2eb0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2ec0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
2ed0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
2ee0: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
2ef0: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
2f00: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
2f10: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
2f20: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
2f30: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
2f40: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
2f50: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
2f60: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
2f70: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
2f80: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
2f90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
2fa0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
2fb0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
2fc0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
2fd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2fe0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
2ff0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3000: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3010: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3020: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3030: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3040: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3050: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3060: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3070: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
3080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3090: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
30a0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
30b0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
30c0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
30d0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
30e0: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
30f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3100: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3110: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3120: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3130: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3140: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3150: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3160: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3170: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
3180: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3190: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
31a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
31b0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
31d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
31e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
31f0: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3210: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3220: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3230: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3240: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3260: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3270: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
3280: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
32b0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
32c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
32d0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
32e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
32f0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3300: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3310: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3320: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3330: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3340: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3350: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3360: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3370: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
3380: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
3390: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
33a0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
33b0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
33c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
33d0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
33e0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
33f0: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3400: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3410: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3420: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3430: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3440: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3450: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3460: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3470: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
3480: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
3490: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
34a0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
34b0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
34c0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
34d0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
34e0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
34f0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3500: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3510: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3520: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3530: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3540: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3550: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3570: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
3580: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
3590: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
35a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
35b0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
35c0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
35d0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
35e0: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
35f0: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3600: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3620: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3630: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3640: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3650: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3660: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3670: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
3680: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
3690: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
36a0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
36b0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
36c0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
36d0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
36e0: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
36f0: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3710: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3720: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3730: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3740: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3750: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3760: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3770: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3790: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
37a0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
37b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
37c0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
37d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
37e0: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
37f0: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3800: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3810: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3820: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3850: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3860: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3870: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3880: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3890: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
38a0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
38b0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
38c0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
38d0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
38e0: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
38f0: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3900: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3910: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3930: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3940: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3950: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3960: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3970: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3980: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3990: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
39a0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
39b0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
39c0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
39d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
39e0: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
39f0: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3a00: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3a10: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3a20: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3a30: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3a40: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3a50: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3a60: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3a70: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3a80: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3a90: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3aa0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3ab0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3ac0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3ad0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3ae0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3af0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3b00: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3b10: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3b20: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3b30: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3b40: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3b50: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3b60: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3b70: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3b80: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3b90: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ba0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3bb0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3bc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3bd0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3be0: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3bf0: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3c00: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3c10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3c20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3c30: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3c40: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3c50: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3c60: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3c70: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3c80: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3c90: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3ca0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3cb0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3cc0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3cd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
3ce0: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
3cf0: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
3d00: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
3d10: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
3d20: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
3d30: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
3d40: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
3d50: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
3d60: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
3d70: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
3d80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
3d90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
3da0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
3db0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
3dc0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
3dd0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
3de0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
3df0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
3e00: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
3e10: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
3e20: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
3e30: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
3e40: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
3e50: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3e60: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3e70: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
3e80: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
3e90: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
3ea0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
3eb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3ec0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
3ed0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
3ee0: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
3ef0: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
3f00: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3f10: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
3f20: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
3f30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
3f40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3f50: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
3f60: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
3f70: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
3f80: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
3f90: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
3fa0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
3fb0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
3fc0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
3fd0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
3fe0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
3ff0: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4000: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4010: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4020: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4030: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4040: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4050: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4060: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4070: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
4080: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
4090: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
40a0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
40b0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
40c0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
40d0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
40e0: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
40f0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4100: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4110: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4120: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4130: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4140: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4150: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4160: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4170: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
4180: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
4190: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
41a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
41b0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
41c0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
41d0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
41e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
41f0: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4200: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64 62  umnToCopy(.  Vdb
4210: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
4220: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f 6e   /* The VDBE con
4230: 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f 20  taining code to 
4240: 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20 69  translate */.  i
4250: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4260: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4270: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4280: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4290: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
42a0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
42b0: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
42c0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
42d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
42e0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
42f0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4300: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4310: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4320: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4330: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4340: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
4350: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
4360: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70 20   */.){.  VdbeOp 
4370: 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  *pOp = sqlite3Vd
4380: 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61 72  beGetOp(v, iStar
4390: 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  t);.  int iEnd =
43a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
43b0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66 6f  entAddr(v);.  fo
43c0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
43d0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
43e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
43f0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4400: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4410: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4420: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4430: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4440: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4450: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4460: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4470: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4480: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4490: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
44a0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
44b0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
44c0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
44d0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
44e0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
44f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4500: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4510: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4520: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4530: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4540: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4550: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4560: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4570: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4580: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4590: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
45a0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
45b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
45c0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
45d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
45e0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
45f0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
4600: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
4610: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
4620: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
4630: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
4640: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
4650: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
4660: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
4670: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
4680: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
4690: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
46a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
46b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
46c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
46d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
46e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
46f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
4700: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4710: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
4720: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4740: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4750: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4760: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4770: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4780: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4790: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
47a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
47b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
47c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
47d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
47e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
47f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4800: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
4810: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
4820: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4830: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
4840: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4850: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
4860: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4870: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
4880: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4890: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
48a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
48b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
48c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
48d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
48e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
48f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
4900: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
4910: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
4920: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
4930: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4940: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4950: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4960: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4970: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4980: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4990: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
49a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
49b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
49c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
49d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
49e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
49f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
4a00: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4a10: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
4a20: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
4a30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4a40: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
4a50: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
4a60: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4a70: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
4a80: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
4a90: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4aa0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
4ab0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
4ac0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4af0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
4b00: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
4b10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4b20: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4b30: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
4b40: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
4b50: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
4b60: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
4b70: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
4b80: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
4b90: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
4ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4bb0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4bc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4bd0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
4be0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
4bf0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
4c00: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
4c10: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
4c20: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
4c30: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
4c40: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
4c50: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
4c60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
4c70: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
4c80: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4c90: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
4ca0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4cb0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
4cc0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
4cd0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
4ce0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
4cf0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
4d00: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
4d10: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
4d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
4d30: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
4d40: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
4d50: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
4d60: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
4d70: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
4d80: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
4d90: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
4da0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
4db0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
4dc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4dd0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
4de0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
4df0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4e00: 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
4e10: 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
4e20: 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
4e30: 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
4e40: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
4e50: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
4e60: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
4e70: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
4e80: 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
4e90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65  ) return 0;.  te
4ea0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
4eb0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
4ec0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
4ed0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
4ee0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4ef0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
4f00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4f10: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
4f20: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
4f30: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
4f40: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
4f50: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
4f60: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
4f70: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
4f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
4f90: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
4fa0: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
4fb0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
4fc0: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
4fd0: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5000: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
5010: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
5020: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
5030: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
5040: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
5050: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
5060: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
5070: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
5080: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
5090: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
50a0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
50b0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
50c0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
50d0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
50e0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
50f0: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
5100: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
5110: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
5120: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5140: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
5150: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
5160: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
5170: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
5180: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
5190: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
51a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
51b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
51c0: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
51d0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
51e0: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
51f0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
5200: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
5210: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
5220: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
5230: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
5260: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
5270: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
5280: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
5290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
52a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
52b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
52c0: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
52d0: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
52e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
52f0: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
5300: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
5310: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
5320: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
5330: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
5340: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
5350: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
5360: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5370: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
5380: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
5390: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
53b0: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
53c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
53e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
53f0: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5410: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
5420: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
5430: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
5440: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
5450: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
5460: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
5470: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
5480: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
5490: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
54a0: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
54b0: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
54c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
54d0: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
54e0: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
54f0: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
5500: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
5510: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
5520: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
5530: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
5540: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
5550: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
5560: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5570: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
5580: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
5590: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
55a0: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
55b0: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
55c0: 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c    Expr *pPartial
55d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
55e0: 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45   Partial Index E
55f0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
5600: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30  nt iContinue = 0
5610: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
5620: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
5630: 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f  excluded rows */
5640: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5650: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
5660: 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
5670: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64  e term being ind
5680: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5690: 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20  drCounter = 0;  
56a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
56b0: 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20 63   where integer c
56c0: 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61  ounter is initia
56d0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  lized */.  int r
56e0: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
56f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
5700: 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68 65  of registers whe
5710: 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73 73  re record is ass
5720: 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  embled */..  /* 
5730: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
5740: 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
5750: 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
5760: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
5770: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
5780: 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
5790: 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
57a0: 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
57b0: 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
57c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
57d0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
57e0: 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
57f0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
5800: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
5810: 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  e(v);..  /* Coun
5820: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5830: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
5840: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
5850: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
5860: 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
5870: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
5880: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65  traints */.  nKe
5890: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  yCol = 0;.  pTab
58a0: 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
58b0: 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
58c0: 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
58d0: 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
58e0: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
58f0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
5900: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
5910: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
5920: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
5930: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
5940: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
5950: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5960: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
5970: 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65  mJoin)    /* pre
5980: 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a  req always non-z
5990: 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ero */.         
59a0: 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
59b0: 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d  JoinTable!=pSrc-
59c0: 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20  >iCursor   /*   
59d0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
59e0: 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  nd   */.        
59f0: 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65   || pLoop->prere
5a00: 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  q!=0 );         
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
5a20: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
5a30: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   JOIN */.    if(
5a40: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d   pLoop->prereq==
5a50: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
5a60: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5a70: 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20  _VIRTUAL)==0.   
5a80: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5a90: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5aa0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
5ab0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  & sqlite3ExprIsT
5ac0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78  ableConstant(pEx
5ad0: 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  pr, pSrc->iCurso
5ae0: 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  r) ){.      pPar
5af0: 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  tial = sqlite3Ex
5b00: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
5b10: 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20  , pPartial,.    
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5b40: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
5b50: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
5b60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5b70: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5b80: 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
5b90: 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
5ba0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
5bb0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
5bc0: 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
5bd0: 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
5be0: 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
5bf0: 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
5c00: 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
5c10: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
5c20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5c30: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
5c40: 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
5c50: 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
5c60: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5c70: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
5c80: 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
5c90: 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
5ca0: 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
5cb0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
5cd0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
5ce0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
5cf0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
5d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5d10: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
5d20: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
5d30: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
5d40: 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
5d50: 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f  b, pLoop, nKeyCo
5d60: 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l+1) ){.        
5d70: 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f    goto end_auto_
5d80: 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20  index_create;.  
5d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5da0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
5db0: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
5dc0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
5dd0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
5de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5df0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
5e00: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
5e10: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
5e20: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
5e30: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
5e40: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
5e50: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
5e60: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
5e70: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
5e90: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
5ea0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
5ec0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
5ed0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
5ee0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
5ef0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
5f00: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
5f10: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
5f20: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
5f30: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
5f40: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
5f50: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
5f60: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
5f70: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
5f80: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
5f90: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
5fa0: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
5fb0: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
5fc0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5fd0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
5fe0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
5ff0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
6000: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
6010: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
6020: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
6030: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
6040: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
6050: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
6060: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
6070: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
6080: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
6090: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
60a0: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
60b0: 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65  MIN(BMS-1,pTable
60c0: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63  ->nCol);.  testc
60d0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
60e0: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
60f0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6100: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
6110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
6120: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6130: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
6140: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
6150: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
6160: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
6170: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
6180: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
6190: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
61a0: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a  - BMS + 1;.  }..
61b0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
61c0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
61d0: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
61e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78   index */.  pIdx
61f0: 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
6200: 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50  teIndexObject(pP
6210: 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f  arse->db, nKeyCo
6220: 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65  l+1, 0, &zNotUse
6230: 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  d);.  if( pIdx==
6240: 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74  0 ) goto end_aut
6250: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
6260: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
6270: 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
6280: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
6290: 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
62a0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
62b0: 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
62c0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
62d0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
62e0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
62f0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
6300: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
6310: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
6320: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
6330: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
6340: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
6350: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
6360: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
6370: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
6380: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
6390: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
63a0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63b0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
63c0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
63d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
63e0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
63f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
6400: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
6410: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
6420: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6430: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
6440: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
6450: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
6460: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
6470: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
6480: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
6490: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
64a0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
64b0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
64c0: 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  l[n] = pColl ? p
64d0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71  Coll->zName : sq
64e0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
64f0: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
6500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6510: 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
6520: 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
6530: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
6540: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
6550: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
6560: 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
6570: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
6580: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6590: 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
65a0: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
65b0: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
65c0: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
65d0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
65e0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
65f0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
6600: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
6610: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
6620: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
6630: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
6640: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
6650: 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  S-1) ){.    for(
6660: 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
6670: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
6680: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6690: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
66a0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
66b0: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
66c0: 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  NARY;.      n++;
66d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
66e0: 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
66f0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
6700: 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[n] = XN_ROWI
6710: 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  D;.  pIdx->azCol
6720: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
6730: 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20 43  rBINARY;..  /* C
6740: 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
6750: 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  tic index */.  a
6760: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
6770: 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
6780: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
6790: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
67a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp2(v, OP_OpenA
67c0: 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
67d0: 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43  ->iIdxCur, nKeyC
67e0: 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ol+1);.  sqlite3
67f0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6800: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
6810: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
6820: 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
6830: 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
6840: 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
6850: 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
6860: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
6870: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
6880: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  sh(pParse);.  pT
6890: 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70  abItem = &pWC->p
68a0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
68b0: 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
68c0: 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  ];.  if( pTabIte
68d0: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
68e0: 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
68f0: 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
6900: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
6910: 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20    addrCounter = 
6920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6930: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6940: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6950: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6960: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
6970: 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
6980: 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
6990: 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64 72  llSub);.    addr
69a0: 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56 64  Top =  sqlite3Vd
69b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
69c0: 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
69d0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
69e0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
69f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
6a00: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
6a10: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
6a20: 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  zName));.  }else
6a30: 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  {.    addrTop = 
6a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a50: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
6a60: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
6a70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6a80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
6a90: 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f  rtial ){.    iCo
6aa0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
6ab0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6ad0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
6ae0: 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74   pPartial, iCont
6af0: 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  inue, SQLITE_JUM
6b00: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c  PIFNULL);.    pL
6b10: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
6b20: 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58  WHERE_PARTIALIDX
6b30: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72  ;.  }.  regRecor
6b40: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6b50: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6b60: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
6b70: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
6b80: 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ey(.      pParse
6b90: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
6ba0: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
6bb0: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20  rd, 0, 0, 0, 0. 
6bc0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6bd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6be0: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6bf0: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6c00: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6c10: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6c20: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6c30: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6c40: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6c50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6c60: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6c70: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6c80: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ca0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
6cb0: 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65  Counter, regBase
6cc0: 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61  +n);.    transla
6cd0: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76  teColumnToCopy(v
6ce0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
6cf0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61 62  l->iTabCur, pTab
6d00: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
6d10: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
6d20: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
6d30: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
6d40: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
6d50: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
6d60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6d70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
6d80: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
6d90: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
6da0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6db0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6dc0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6dd0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
6de0: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
6df0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6e00: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
6e10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e30: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
6e40: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
6e50: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
6e60: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
6e70: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
6e80: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
6e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
6ea0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
6eb0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
6ec0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
6ed0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6ee0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
6ef0: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
6f00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6f10: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
6f20: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
6f30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6f40: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
6f50: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
6f60: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
6f70: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
6f80: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
6f90: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
6fa0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
6fb0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
6fc0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
6fd0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
6fe0: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
6ff0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7000: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7010: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7020: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7030: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7040: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7050: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
7060: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
7070: 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
7080: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7090: 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20  /* Ignore terms 
70a0: 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65  with these prere
70b0: 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  qs */.  struct S
70c0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
70d0: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
70e0: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
70f0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
7100: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
7110: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7120: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7130: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7140: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7150: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7160: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7170: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7180: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7190: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
71a0: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
71b0: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
71c0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
71d0: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
71e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
71f0: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
7200: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
7210: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
7220: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
7230: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
7240: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
7250: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
7260: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
7270: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
7280: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
7290: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
72a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
72b0: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
72c0: 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65  ight & mUnusable
72d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
72e0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
72f0: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
7300: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
7310: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
7320: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7330: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
7340: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7350: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7360: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
7370: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7380: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7390: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
73a0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
73b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
73c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
73d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
73e0: 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
73f0: 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20  QUIV|WO_IS))==0 
7400: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7410: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
7420: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
7430: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7440: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75  assert( pTerm->u
7450: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  .leftColumn>=(-1
7460: 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  ) );.    nTerm++
7470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7480: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7490: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
74a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
74b0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
74c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
74d0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
74e0: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
74f0: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
7500: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7510: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
7520: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
7530: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
7540: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
7550: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
7560: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
7570: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
7580: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7590: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
75a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
75b0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
75c0: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
75d0: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
75e0: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
75f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
7600: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
7610: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
7620: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7630: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7640: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7650: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
7660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7670: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
7680: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
7690: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
76c0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
76d0: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
7700: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
7710: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
7720: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
7730: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7740: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
7750: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
7760: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7770: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7780: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
7790: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
77a0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
77b0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
77c0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
77d0: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
77e0: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
77f0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7800: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7810: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7820: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7830: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7840: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
7850: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
7860: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
7870: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
7880: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7890: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
78a0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
78b0: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
78c0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
78d0: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
78e0: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
78f0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7900: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7910: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7920: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7930: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7940: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
7950: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
7960: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
7970: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
7980: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7990: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
79a0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
79b0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
79c0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
79d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
79e0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
79f0: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7a00: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7a10: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7a20: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7a30: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7a40: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7a50: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
7aa0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7ab0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7ac0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7ad0: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7ae0: 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66     u8 op;.    if
7af0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
7b00: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
7b10: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
7b20: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
7b30: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
7b40: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
7b50: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7b60: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
7b70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7b80: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
7b90: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7ba0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7bb0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
7bc0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7bd0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
7be0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7bf0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7c00: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7c10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7c20: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7c30: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
7c40: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
7c50: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
7c60: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
7c70: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
7c80: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
7c90: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
7ca0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
7cb0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
7cc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
7cd0: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
7ce0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
7cf0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
7d00: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
7d10: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
7d20: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
7d30: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
7d40: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
7d50: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
7d60: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
7d70: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
7d80: 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  WO_MATCH ){.    
7d90: 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d    op = pTerm->eM
7da0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  atchOp;.    }.  
7db0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
7dc0: 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68   = op;.    /* Th
7dd0: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
7de0: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
7df0: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
7e00: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
7e10: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
7e20: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
7e30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
7e40: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
7e50: 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
7e60: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
7e70: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
7e80: 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
7e90: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
7ea0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
7eb0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
7ec0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
7ed0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7ee0: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
7ef0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
7f00: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7f10: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
7f20: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
7f30: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7f40: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
7f50: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
7f60: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7f70: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
7f80: 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
7f90: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7fa0: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
7fb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
7fc0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7fd0: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f   (WO_IN|WO_EQ|WO
7fe0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
7ff0: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
8000: 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
8020: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
8030: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
8040: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8050: 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
8060: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
8070: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
8080: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
8090: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
80a0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
80b0: 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rder;.  }..  ret
80c0: 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a  urn pIdxInfo;.}.
80d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
80e0: 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
80f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
8100: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
8110: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8120: 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65  .** must represe
8130: 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  nt a virtual tab
8140: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
8150: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42  n invokes the xB
8160: 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65  estIndex().** me
8170: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
8180: 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74  ual table with t
8190: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
81a0: 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  _info object tha
81b0: 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73  t.** comes in as
81c0: 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e   the 3rd argumen
81d0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
81e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
81f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50  error occurs, pP
8200: 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65  arse is populate
8210: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
8220: 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a  message and a.**
8230: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
8240: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
8250: 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
8260: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75  urned and the ou
8270: 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20  tput.** part of 
8280: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
8290: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
82a0: 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74   is left populat
82b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  ed..**.** Whethe
82c0: 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
82d0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
82e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
82f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
8300: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
8310: 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
8320: 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
8330: 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
8340: 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
8350: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
8360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
8370: 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
8380: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
8390: 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
83a0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
83b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
83c0: 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
83d0: 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
83e0: 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
83f0: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
8400: 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f  nt rc;..  TRACE_
8410: 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
8420: 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
8430: 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
8440: 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
8450: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
8460: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
8470: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8480: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
8490: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
84a0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50  lite3OomFault(pP
84b0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  arse->db);.    }
84c0: 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
84d0: 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
84e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
84f0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
8500: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
8510: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
8520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8540: 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
8550: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
8560: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
8570: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
8580: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
8590: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
85a0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
85b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
85c0: 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
85d0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
85e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
85f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
8600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8610: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8620: 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
8630: 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
8640: 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
8650: 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
8660: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
8670: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
8680: 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
8690: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
86a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
86b0: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
86c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
86d0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
86e0: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
86f0: 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
8700: 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
8710: 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
8720: 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
8730: 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
8740: 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
8750: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
8760: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
8770: 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
8780: 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
8790: 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74  pRec.**    aStat
87a0: 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
87b0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
87c0: 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a  al to pRec.**.**
87d0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
87e0: 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
87f0: 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
8800: 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
8810: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
8820: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8830: 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20  pRec. Note that 
8840: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  this index is no
8850: 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e  t an index.** in
8860: 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  to the aSample[]
8870: 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61   array - it is a
8880: 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76  n index into a v
8890: 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61  irtual set of sa
88a0: 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f  mples.** based o
88b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
88c0: 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20  f aSample[] and 
88d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
88e0: 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a  elds in record .
88f0: 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61  ** pRec. .*/.sta
8900: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
8910: 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
8920: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8930: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
8950: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8970: 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
8980: 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
8990: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
89a0: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
89b0: 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
89c0: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
89d0: 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89f0: 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
8a00: 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
8a10: 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
8a20: 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
8a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8a40: 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
8a50: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
8a60: 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
8a70: 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
8a80: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
8ab0: 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
8ac0: 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
8ad0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8af0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d  dex of first sam
8b00: 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20  ple >= pRec */. 
8b10: 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20   int iSample;   
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b30: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8b40: 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65  larger than or e
8b50: 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
8b60: 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b80: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
8b90: 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
8ba0: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
8bd0: 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
8be0: 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
8bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
8c00: 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
8c10: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
8c20: 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8c40: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
8c50: 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f  in pRec */.  tRo
8c60: 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
8c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74           /* anLt
8c80: 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c  [] + anEq[] of l
8c90: 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52  argest sample pR
8ca0: 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e  ec is > */..#ifn
8cb0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8cc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8cd0: 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23  TER( pParse );.#
8ce0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
8cf0: 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRec!=0 );.  ass
8d00: 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
8d10: 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
8d20: 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
8d30: 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64   && pRec->nField
8d40: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  <=pIdx->nSampleC
8d50: 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61  ol );..  /* Do a
8d60: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
8d70: 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  o find the first
8d80: 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20   sample greater 
8d90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
8da0: 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70  ** to pRec. If p
8db0: 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  Rec contains a s
8dc0: 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65  ingle field, the
8dd0: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20   set of samples 
8de0: 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69  to search.  ** i
8df0: 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61  s simply the aSa
8e00: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66  mple[] array. If
8e10: 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20   the samples in 
8e20: 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69  aSample[] contai
8e30: 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e  n more.  ** than
8e40: 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c   one fields, all
8e50: 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e   fields followin
8e60: 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  g the first are 
8e70: 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  ignored..  **.  
8e80: 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  ** If pRec conta
8e90: 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68  ins N fields, wh
8ea0: 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68  ere N is more th
8eb0: 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20  an one, then as 
8ec0: 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a  well as the.  **
8ed0: 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d   samples in aSam
8ee0: 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64  ple[] (truncated
8ef0: 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74   to N fields), t
8f00: 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68  he search also h
8f10: 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69  as to.  ** consi
8f20: 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20  der prefixes of 
8f30: 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46  those samples. F
8f40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
8f50: 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
8f60: 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c  s.  ** in aSampl
8f70: 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e is:.  **.  ** 
8f80: 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d      aSample[0] =
8f90: 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
8fa0: 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28    aSample[1] = (
8fb0: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
8fc0: 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62   aSample[2] = (b
8fd0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
8fe0: 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20  Sample[3] = (c, 
8ff0: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  100) .  **     a
9000: 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20  Sample[4] = (c, 
9010: 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  105).  **.  ** T
9020: 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73  hen the search s
9030: 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61  pace should idea
9040: 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c  lly be the sampl
9050: 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65  es above and the
9060: 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72   .  ** unique pr
9070: 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20  efixes [a], [b] 
9080: 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e  and [c]. But sin
9090: 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20  ce that is hard 
90a0: 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20  to organize, .  
90b0: 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75  ** the code actu
90c0: 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68  ally searches th
90d0: 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a  is set:.  **.  *
90e0: 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20  *     0: (a) .  
90f0: 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29  **     1: (a, 5)
9100: 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61   .  **     2: (a
9110: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
9120: 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  3: (a, 10) .  **
9130: 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a       4: (b) .  *
9140: 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20  *     5: (b, 5) 
9150: 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29  .  **     6: (c)
9160: 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63   .  **     7: (c
9170: 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
9180: 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   8: (c, 105).  *
9190: 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35  *     9: (c, 105
91a0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ).  **.  ** For 
91b0: 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74  each sample in t
91c0: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
91d0: 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72  ay, N samples ar
91e0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
91f0: 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20  .  ** effective 
9200: 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e  sample array. In
9210: 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70   the above, samp
9220: 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20  les 0 and 1 are 
9230: 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73  based on .  ** s
9240: 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d  ample aSample[0]
9250: 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20  . Samples 2 and 
9260: 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20  3 on aSample[1] 
9270: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  etc..  **.  ** O
9280: 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f  ften, sample i o
9290: 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20  f each block of 
92a0: 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  N effective samp
92b0: 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69  les has (i+1) fi
92c0: 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70  elds..  ** Excep
92d0: 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d  t, each sample m
92e0: 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  ay be extended t
92f0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74  o ensure that it
9300: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9310: 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74   or.  ** equal t
9320: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  o the previous s
9330: 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72  ample in the arr
9340: 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ay. For example,
9350: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a   in the above, .
9360: 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73    ** sample 2 is
9370: 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
9380: 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20  e of a block of 
9390: 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74  N samples, so at
93a0: 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20   first it .  ** 
93b0: 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
93c0: 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c  should be 1 fiel
93d0: 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76  d in size. Howev
93e0: 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  er, that would m
93f0: 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61  ake it .  ** sma
9400: 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
9410: 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72   1, so the binar
9420: 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e  y search would n
9430: 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65  ot work. As a re
9440: 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69  sult, .  ** it i
9450: 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77  s extended to tw
9460: 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75  o fields. The du
9470: 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68  plicates that th
9480: 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f  is creates do no
9490: 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  t .  ** cause an
94a0: 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
94b0: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63  .  nField = pRec
94c0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c  ->nField;.  iCol
94d0: 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20   = 0;.  iSample 
94e0: 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  = pIdx->nSample 
94f0: 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a  * nField;.  do{.
9500: 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20      int iSamp;  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53    /* Index in aS
9530: 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20  ample[] of test 
9540: 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  sample */.    in
9550: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
9560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9570: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
9580: 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  in test sample *
9590: 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  /..    iTest = (
95a0: 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b  iMin+iSample)/2;
95b0: 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65  .    iSamp = iTe
95c0: 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20  st / nField;.   
95d0: 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a   if( iSamp>0 ){.
95e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
95f0: 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20  posed effective 
9600: 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66  sample is a pref
9610: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61  ix of sample aSa
9620: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20  mple[iSamp]..   
9630: 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c     ** Specifical
9640: 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74  ly, the shortest
9650: 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65   prefix of at le
9660: 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e  ast (1 + iTest%n
9670: 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a  Field) .      **
9680: 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20   fields that is 
9690: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
96a0: 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74   previous effect
96b0: 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a  ive sample.  */.
96c0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65        for(n=(iTe
96d0: 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31  st % nField) + 1
96e0: 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29  ; n<nField; n++)
96f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
9700: 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61  ample[iSamp-1].a
9710: 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c  nLt[n-1]!=aSampl
9720: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9730: 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1] ) break;.    
9740: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9750: 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b       n = iTest +
9760: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
9770: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b  Rec->nField = n;
9780: 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
9790: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
97a0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d  are(aSample[iSam
97b0: 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53  p].n, aSample[iS
97c0: 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20  amp].p, pRec);. 
97d0: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
97e0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
97f0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9800: 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c  Lt[n-1] + aSampl
9810: 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d  e[iSamp].anEq[n-
9820: 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
9830: 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
9840: 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26  lse if( res==0 &
9850: 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20  & n<nField ){.  
9860: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
9870: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
9880: 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
9890: 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
98a0: 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
98b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53   }else{.      iS
98c0: 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20  ample = iTest;. 
98d0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b       iCol = n-1;
98e0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
98f0: 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61   res && iMin<iSa
9900: 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53  mple );.  i = iS
9910: 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a  ample / nField;.
9920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9930: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f  EBUG.  /* The fo
9940: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
9950: 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20  tatements check 
9960: 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20  that the binary 
9970: 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a  search code.  **
9980: 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65   above found the
9990: 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54   right answer. T
99a0: 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
99b0: 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65   no purpose othe
99c0: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69  r.  ** than to i
99d0: 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74  nvoke the assert
99e0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
99f0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9a00: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
9a10: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
9a20: 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
9a30: 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
9a40: 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71   pRec must be eq
9a50: 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e  ual to sample i.
9a60: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9a70: 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
9a80: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9a90: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
9aa0: 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  1 );.      pRec-
9ab0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
9ac0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ad0: 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65  0==sqlite3VdbeRe
9ae0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9af0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
9b00: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20  e[i].p, pRec) . 
9b10: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9b20: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9b30: 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a  ailed .      );.
9b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b50: 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49   /* Unless i==pI
9b60: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64  dx->nSample, ind
9b70: 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65  icating that pRe
9b80: 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  c is larger than
9b90: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61  .      ** all sa
9ba0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61  mples in the aSa
9bb0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52  mple[] array, pR
9bc0: 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c  ec must be small
9bd0: 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
9be0: 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69    ** (iCol+1) fi
9bf0: 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
9c00: 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20  mple i.  */.    
9c10: 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64    assert( i<=pId
9c20: 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e  x->nSample && i>
9c30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  =0 );.      pRec
9c40: 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b  ->nField = iCol+
9c50: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
9c60: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
9c70: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  e .           ||
9c80: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9c90: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9ca0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9cb0: 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
9cc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9cd0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9ce0: 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f  iled );..      /
9cf0: 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43  * if i==0 and iC
9d00: 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f  ol==0, then reco
9d10: 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c  rd pRec is small
9d20: 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70  er than all samp
9d30: 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  les.      ** in 
9d40: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9d50: 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
9d60: 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e  if (iCol>0) then
9d70: 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20   pRec must.     
9d80: 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74   ** be greater t
9d90: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
9da0: 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64  the (iCol) field
9db0: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9dc0: 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  e i..      ** If
9dd0: 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65   (i>0), then pRe
9de0: 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67  c must also be g
9df0: 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70  reater than samp
9e00: 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  le (i-1).  */.  
9e10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
9e20: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
9e30: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20  nField = iCol;. 
9e40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9e50: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9e60: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9e70: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
9e80: 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20  .p, pRec)<=0.   
9e90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9ea0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9eb0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
9ec0: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29  .      if( i>0 )
9ed0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
9ee0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9ef0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9f00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9f10: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9f20: 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c  e[i-1].n, aSampl
9f30: 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c  e[i-1].p, pRec)<
9f40: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
9f50: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9f60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9f80: 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
9f90: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
9fa0: 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
9fb0: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70  .    /* Record p
9fc0: 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Rec is equal to 
9fd0: 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20  sample i */.    
9fe0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
9ff0: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53  ield-1 );.    aS
a000: 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
a010: 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
a020: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
a030: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
a040: 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
a050: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
a060: 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31  int, the (iCol+1
a070: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
a080: 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20  f aSample[i] is 
a090: 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a  the first .    *
a0a0: 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  * sample that is
a0b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52   greater than pR
a0c0: 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49  ec. Or, if i==pI
a0d0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e  dx->nSample then
a0e0: 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20   pRec.    ** is 
a0f0: 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
a100: 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
a110: 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f  rray. */.    tRo
a120: 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61  wcnt iUpper, iGa
a130: 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49  p;.    if( i>=pI
a140: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  dx->nSample ){. 
a150: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71       iUpper = sq
a160: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
a170: 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
a180: 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  st[0]);.    }els
a190: 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  e{.      iUpper 
a1a0: 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
a1b0: 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a  t[iCol];.    }..
a1c0: 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
a1d0: 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
a1e0: 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
a1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
a200: 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
a210: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
a220: 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
a230: 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
a240: 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
a250: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
a260: 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
a270: 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
a280: 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74   + iGap;.    aSt
a290: 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41  at[1] = pIdx->aA
a2a0: 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a  vgEq[iCol];.  }.
a2b0: 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
a2c0: 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76  e pRec->nField v
a2d0: 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
a2e0: 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65  rning.  */.  pRe
a2f0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
a300: 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  ld;.  return i;.
a310: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a320: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
a330: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
a340: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
a350: 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61  NULL, pTerm is a
a360: 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69   term that provi
a370: 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20  des an upper or 
a380: 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f  lower.** bound o
a390: 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20  n a range scan. 
a3a0: 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72  Without consider
a3b0: 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73  ing pTerm, it is
a3c0: 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74   estimated .** t
a3d0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c  hat the scan wil
a3e0: 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77  l visit nNew row
a3f0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
a400: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
a410: 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ber.** estimated
a420: 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61   to be visited a
a430: 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72  fter taking pTer
a440: 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a  m into account..
a450: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
a460: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  r explicitly spe
a470: 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68  cified a likelih
a480: 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20  ood() value for 
a490: 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68  this term,.** th
a4a0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
a4b0: 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c  lue is the likel
a4c0: 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64  ihood multiplied
a4d0: 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
a4e0: 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e  f.** input rows.
a4f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
a500: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
a510: 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f  s that an "IS NO
a520: 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20  T NULL" term.** 
a530: 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  has a likelihood
a540: 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e   of 0.50, and an
a550: 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c  y other term a l
a560: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32  ikelihood of 0.2
a570: 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  5..*/.static Log
a580: 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64  Est whereRangeAd
a590: 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a  just(WhereTerm *
a5a0: 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e  pTerm, LogEst nN
a5b0: 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52  ew){.  LogEst nR
a5c0: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28  et = nNew;.  if(
a5d0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
a5e0: 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
a5f0: 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ob<=0 ){.      n
a600: 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Ret += pTerm->tr
a610: 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c  uthProb;.    }el
a620: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77  se if( (pTerm->w
a630: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
a640: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
a650: 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20   nRet -= 20;    
a660: 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
a670: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
a680: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
a690: 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
a6a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a6b0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
a6c0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TAT4./*.** Retur
a6d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66  n the affinity f
a6e0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  or a single colu
a6f0: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a  mn of an index..
a700: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73  */.static char s
a710: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
a720: 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65  nAffinity(sqlite
a730: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
a740: 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  dx, int iCol){. 
a750: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
a760: 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
a770: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20  Column );.  if( 
a780: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
a790: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
a7a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
a7b0: 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29  r(db, pIdx)==0 )
a7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
a7d0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72  FF_BLOB;.  }.  r
a7e0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c  eturn pIdx->zCol
a7f0: 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e  Aff[iCol];.}.#en
a800: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
a810: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a820: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
a830: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a840: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
a850: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
a860: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
a870: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
a880: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
a890: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
a8a0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
a8b0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
a8c0: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
a8d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
a8e0: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
a8f0: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
a900: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
a910: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
a920: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
a930: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
a940: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
a950: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
a960: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
a970: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
a980: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
a990: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
a9a0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
a9b0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
a9c0: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
a9d0: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
a9e0: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
a9f0: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
aa00: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
aa10: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
aa20: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
aa30: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
aa40: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
aa50: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
aa60: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
aa70: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
aa80: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
aa90: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
aaa0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
aab0: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
aac0: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
aad0: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
aae0: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
aaf0: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
ab00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
ab10: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
ab20: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
ab30: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
ab40: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
ab50: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
ab60: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
ab70: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
ab80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
ab90: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
aba0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
abb0: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
abc0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
abd0: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
abe0: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
abf0: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
ac00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
ac10: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
ac20: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
ac30: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
ac40: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
ac50: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
ac60: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
ac70: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
ac80: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
ac90: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
aca0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
acb0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
acc0: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
acd0: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
ace0: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
acf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ad00: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
ad10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
ad20: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
ad30: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
ad40: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
ad50: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
ad60: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
ad70: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
ad80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ad90: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
ada0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
adb0: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
adc0: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
add0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
ade0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
adf0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
ae00: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
ae10: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
ae20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae30: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
ae40: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
ae50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
ae60: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
ae70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
ae80: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
ae90: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
aea0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
aeb0: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
aec0: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
aed0: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
aee0: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
aef0: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
af00: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
af10: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
af20: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
af30: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
af40: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
af50: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
af60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
af70: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
af80: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
af90: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
afa0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
afb0: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
afc0: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
afd0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
afe0: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
aff0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
b000: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b010: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b020: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
b030: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
b040: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
b050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b060: 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69  .  u8 aff = sqli
b070: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
b080: 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45  finity(db, p, nE
b090: 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  q);.  CollSeq *p
b0a0: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
b0b0: 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
b0c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
b0d0: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b0e0: 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
b0f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
b100: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
b110: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
b120: 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
b130: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b140: 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
b150: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b160: 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
b170: 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
b180: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
b190: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b1a0: 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
b1b0: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
b1c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b1d0: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b1e0: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
b1f0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b200: 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
b210: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
b220: 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
b230: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b250: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b260: 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
b270: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b280: 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
b290: 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
b2a0: 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
b2b0: 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
b2c0: 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
b2d0: 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
b2e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
b2f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
b300: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
b310: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
b320: 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
b330: 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
b340: 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
b350: 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
b360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
b380: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b390: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
b3a0: 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
b3b0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
b3c0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
b3d0: 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
b3e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b3f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
b400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b410: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
b420: 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
b430: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
b440: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
b450: 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
b460: 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
b470: 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
b480: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
b490: 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
b4a0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b4b0: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
b4c0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
b4d0: 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
b4e0: 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
b4f0: 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
b500: 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
b510: 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
b520: 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
b530: 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
b540: 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
b550: 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
b560: 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
b570: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
b580: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
b590: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
b5a0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
b5b0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
b5c0: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
b5d0: 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
b5e0: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
b5f0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
b600: 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
b610: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
b620: 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
b630: 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
b640: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
b650: 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
b660: 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
b670: 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
b680: 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
b690: 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
b6a0: 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
b6b0: 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
b6c0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
b6d0: 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
b6e0: 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
b6f0: 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
b700: 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
b730: 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
b740: 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
b750: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
b760: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
b770: 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
b780: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
b790: 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
b7a0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
b7b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b7c0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
b7d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
b7e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
b7f0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
b800: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
b810: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b820: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
b830: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b840: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
b850: 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
b860: 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
b870: 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
b880: 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
b890: 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
b8a0: 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
b8b0: 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
b8c0: 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
b8d0: 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
b8e0: 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
b8f0: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
b900: 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
b910: 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
b920: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
b930: 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
b940: 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
b950: 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
b960: 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
b970: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
b980: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
b990: 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
b9b0: 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
b9e0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
b9f0: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
ba00: 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
ba10: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
ba20: 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
ba30: 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
ba40: 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
ba50: 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
ba60: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
ba70: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
ba80: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
ba90: 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
baa0: 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
bab0: 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e  ee.nEq) is the n
bac0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
bad0: 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62  ex.** column sub
bae0: 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67  ject to the rang
baf0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
bb00: 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
bb10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
bb20: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
bb30: 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20  aints optimized 
bb40: 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
bb50: 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
bb60: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75  example,.** assu
bb70: 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20  ming index p is 
bb80: 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
bb90: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
bba0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
bbb0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
bbc0: 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
bbd0: 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
bbe0: 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
bbf0: 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61   to 1 (as the ra
bc00: 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
bc10: 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65  olumn, b, is the
bc20: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74   second .** left
bc30: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
bc40: 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
bc50: 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
bc60: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
bc70: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
bc80: 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
bc90: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
bca0: 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
bcb0: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
bcc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
bcd0: 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
bce0: 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  the sqlite3LogEs
bcf0: 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
bd00: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
bd10: 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
bd20: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
bd30: 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
bd40: 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
bd50: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
bd60: 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
bd70: 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73  , then *pnOut is
bd80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
bd90: 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
bda0: 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
bdb0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
bdc0: 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
bdd0: 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
bde0: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
bdf0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
be00: 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
be10: 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
be20: 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
be30: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
be40: 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
be50: 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
be60: 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61  ot be.** used, a
be70: 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e   single range in
be80: 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
be90: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
bea0: 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
beb0: 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61   4. .** and a pa
bec0: 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
bed0: 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
bee0: 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
bef0: 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
bf00: 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
bf10: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34  y a factor of 64
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf30: 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
bf40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bf50: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
bf60: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
bf70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
bf80: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
bf90: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
bfa0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
bfb0: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
bfc0: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
bfd0: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
bfe0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
bff0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
c000: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
c010: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
c020: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
c030: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c040: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
c050: 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
c060: 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
c070: 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
c080: 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
c090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c0a0: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
c0b0: 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
c0c0: 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
c0d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c0e0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
c0f0: 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
c100: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
c110: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
c120: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
c130: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
c140: 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e  ple>0 && nEq<p->
c150: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20  nSampleCol ){.  
c160: 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
c170: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
c180: 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
c190: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
c1a0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
c1b0: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
c1c0: 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
c1d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
c1e0: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
c1f0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
c200: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
c210: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c220: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
c230: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
c240: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
c250: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
c260: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
c270: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
c280: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
c290: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
c2a0: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
c2b0: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
c2c0: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
c2d0: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
c2e0: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
c2f0: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
c300: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
c310: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
c320: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
c330: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
c340: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
c350: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
c360: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
c370: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
c380: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
c390: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
c3a0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
c3b0: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
c3c0: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
c3d0: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
c3e0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
c3f0: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
c400: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
c410: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
c420: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
c430: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
c440: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
c450: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
c460: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
c470: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
c480: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
c490: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
c4a0: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
c4b0: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
c4c0: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
c4d0: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
c4e0: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
c4f0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
c500: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
c510: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
c520: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
c530: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
c540: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
c550: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
c560: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
c570: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
c580: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
c590: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
c5a0: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
c5b0: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
c5c0: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
c5d0: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
c5e0: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
c5f0: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
c600: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c610: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
c620: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
c630: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
c640: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
c650: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
c660: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
c670: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
c680: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
c690: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
c6a0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c6b0: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
c6c0: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c6d0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
c6e0: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
c6f0: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
c700: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
c710: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
c720: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
c730: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
c740: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
c750: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
c760: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
c770: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c780: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
c790: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c7a0: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
c7b0: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
c7c0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7e0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  aff = sqlite3Ind
c7f0: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
c800: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
c810: 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nEq);.      asse
c820: 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79  rt( nEq!=p->nKey
c830: 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  Col || aff==SQLI
c840: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
c850: 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ;.      /* Deter
c860: 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20  mine iLower and 
c870: 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50  iUpper using ($P
c880: 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  ) only. */.     
c890: 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20   if( nEq==0 ){. 
c8a0: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
c8b0: 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  0;.        iUppe
c8c0: 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b  r = p->nRowEst0;
c8d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c8e0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
c8f0: 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
c900: 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
c910: 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
c920: 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
c930: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62         ** have b
c940: 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
c950: 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
c960: 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
c970: 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
c980: 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
c990: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
c9a0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
c9b0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
c9c0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ];.        iUppe
c9d0: 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
c9e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c9f0: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d  assert( pLower==
ca00: 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  0 || (pLower->eO
ca10: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
ca20: 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
ca30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70       assert( pUp
ca40: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
ca50: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
ca60: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
ca70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ca80: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  ( p->aSortOrder!
ca90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
caa0: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  p->aSortOrder[nE
cab0: 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  q] ){.        /*
cac0: 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c   The roles of pL
cad0: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
cae0: 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20  are swapped for 
caf0: 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a  a DESC index */.
cb00: 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65          SWAP(Whe
cb10: 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c  reTerm*, pLower,
cb20: 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20   pUpper);.      
cb30: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
cb40: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
cb50: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
cb60: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
cb70: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
cb80: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
cb90: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
cbc0: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
cbd0: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
cbe0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
cbf0: 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
cc00: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
cc10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cc20: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
cc30: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
cc40: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
cc50: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
cc60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cc70: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
cc80: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
cc90: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
cca0: 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72    iLwrIdx = wher
ccb0: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
ccc0: 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
ccd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
cce0: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
ccf0: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
cd00: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
cd10: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
cd20: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
cd30: 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
cd40: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cd50: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
cd60: 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     pLower = 0;. 
cd70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cd80: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
cd90: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
cda0: 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
cdb0: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
cdc0: 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$U). */.      i
cdd0: 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
cde0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
ce10: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ce20: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
ce30: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
ce40: 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
ce50: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
ce60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
ce70: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
ce80: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
ce90: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cea0: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
ceb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cec0: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
ced0: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cee0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cef0: 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65   iUprIdx = where
cf00: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cf10: 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
cf20: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cf30: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
cf40: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
cf50: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
cf60: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
cf70: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
cf80: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
cf90: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
cfa0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
cfb0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
cfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cfd0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
cfe0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
cff0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d000: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d010: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
d020: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
d030: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
d040: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
d050: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
d060: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
d070: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
d080: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
d090: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
d0a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
d0b0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
d0c0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
d0d0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
d0e0: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
d0f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
d100: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
d110: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
d120: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
d130: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
d140: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
d150: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
d160: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
d170: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
d180: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
d190: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
d1a0: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
d1b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
d1e0: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
d1f0: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
d200: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
d210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d220: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
d230: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
d240: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
d250: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
d260: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
d270: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
d280: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
d290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
d2b0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
d2c0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
d2d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d2e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
d2f0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
d300: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
d310: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
d320: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
d330: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
d340: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
d350: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d360: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d370: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d380: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
d390: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
d3a0: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
d3b0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
d3c0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
d3d0: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
d3e0: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
d3f0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
d400: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
d410: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
d420: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
d430: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
d440: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
d450: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
d460: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
d470: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
d480: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
d490: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
d4a0: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
d4b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
d4c0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
d4d0: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
d4e0: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
d4f0: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
d500: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
d510: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
d520: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
d530: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
d540: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
d550: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
d560: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
d570: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
d580: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
d590: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
d5a0: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
d5b0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
d5c0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
d5d0: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
d5e0: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
d5f0: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
d600: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
d610: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
d620: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
d630: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
d640: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
d650: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
d660: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
d670: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
d680: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
d690: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
d6a0: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
d6b0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d6c0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
d6d0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
d6e0: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
d6f0: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
d700: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
d710: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
d720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d730: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
d740: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
d750: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
d760: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
d770: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
d780: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d790: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d7a0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
d7b0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
d7c0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
d7d0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
d7e0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
d7f0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d800: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
d810: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
d820: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
d830: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
d840: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
d850: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
d860: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
d870: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
d880: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
d890: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
d8a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
d8b0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
d8c0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
d8d0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
d8e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
d8f0: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
d900: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
d910: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
d920: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
d930: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
d940: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
d950: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
d960: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
d970: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
d980: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
d990: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
d9a0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
d9b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d9c0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
d9d0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
d9e0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
d9f0: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
da00: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
da10: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
da20: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
da30: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
da40: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
da50: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
da60: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
da70: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
da80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
da90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
daa0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
dab0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
dac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
dad0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
dae0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
daf0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
db00: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
db10: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
db20: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
db30: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
db40: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
db50: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
db60: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
db70: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
db80: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
db90: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
dba0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
dbb0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
dbc0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
dbd0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
dbe0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
dbf0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
dc00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
dc10: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
dc20: 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b  >pRec;.  u8 aff;
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
dc50: 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
dc60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
dc70: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
dc80: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
dc90: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
dca0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
dcb0: 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
dcc0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
dcd0: 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
dce0: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70    assert( nEq<=p
dcf0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
dd00: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
dd10: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
dd20: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
dd30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
dd40: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
dd50: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
dd60: 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
dd70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
dd80: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
dd90: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
dda0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
ddb0: 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
ddc0: 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
ddd0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
dde0: 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
ddf0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
de00: 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de20: 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
de30: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
de40: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
de50: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
de60: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
de70: 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
de80: 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
de90: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
dea0: 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70   */.  if( nEq>=p
deb0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
dec0: 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
ded0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dee0: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
def0: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
df00: 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  mnAffinity(pPars
df10: 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29  e->db, p, nEq-1)
df20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
df30: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
df40: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
df50: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
df60: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
df70: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
df80: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
df90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
dfa0: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
dfb0: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
dfc0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
dfd0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
dfe0: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
dff0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
e000: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
e010: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
e020: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
e030: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
e040: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
e070: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
e080: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
e090: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
e0a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e0b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e0c0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
e0d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e0e0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
e0f0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
e100: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e110: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
e120: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
e130: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
e140: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
e150: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e160: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
e170: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
e180: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
e190: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
e1a0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
e1b0: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
e1c0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
e1d0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
e1e0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
e1f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
e200: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
e210: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
e220: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
e230: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
e240: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
e250: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e260: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
e270: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
e280: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
e290: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
e2a0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
e2b0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
e2c0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
e2d0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
e2e0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
e2f0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
e300: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
e310: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
e320: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
e330: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
e340: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
e350: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
e360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e370: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
e380: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
e390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e3a0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
e3b0: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
e3c0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e3d0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
e3e0: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
e3f0: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
e400: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
e410: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
e420: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
e430: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
e440: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
e450: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
e460: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e470: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
e480: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
e490: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
e4a0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
e4b0: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
e4c0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e4d0: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
e4e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e4f0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
e500: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e510: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
e520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e530: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
e540: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
e550: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
e560: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
e570: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
e580: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
e590: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e5b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e5c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
e5d0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
e5e0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e5f0: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
e600: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e610: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
e620: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
e630: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
e640: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
e650: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
e660: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
e670: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
e680: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e690: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
e6a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
e6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e6c0: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
e6d0: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
e6e0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
e6f0: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
e700: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
e710: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
e720: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
e730: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
e740: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
e750: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
e760: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
e770: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e780: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e790: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e7a0: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
e7b0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
e7c0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
e7d0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
e7e0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
e7f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
e800: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
e810: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
e820: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
e830: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
e840: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e850: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
e860: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
e870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
e880: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d   zType[4];.    m
e890: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
e8a0: 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  .", 4);.    if( 
e8b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
e8c0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
e8d0: 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a  zType[0] = 'V';.
e8e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
e8f0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
e900: 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
e910: 3d 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45  = 'E';.    if( E
e920: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e930: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
e940: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70  FromJoin) ) zTyp
e950: 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20  e[2] = 'L';.    
e960: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e970: 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
e980: 2d 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73  -%-3d %p %s curs
e990: 6f 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33  or=%-3d prob=%-3
e9a0: 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c  d op=0x%03x wtFl
e9b0: 61 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20  ags=0x%04x\n",. 
e9c0: 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
e9d0: 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d  rm, zType, pTerm
e9e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54  ->leftCursor, pT
e9f0: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
ea00: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
ea10: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
ea20: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71  wtFlags);.    sq
ea30: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
ea40: 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
ea50: 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
ea60: 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
ea70: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
ea80: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
ea90: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
eaa0: 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
eab0: 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
eac0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
ead0: 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
eae0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
eaf0: 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
eb00: 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
eb10: 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
eb20: 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
eb30: 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
eb40: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
eb50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
eb60: 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
eb70: 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
eb80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
eb90: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
eba0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ebb0: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
ebc0: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ebe0: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
ebf0: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
ec00: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
ec10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ec20: 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
ec50: 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
ec60: 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
ec70: 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
ec80: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
ec90: 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
eca0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ecb0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
ecc0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
ecd0: 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
ece0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
ecf0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ed00: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
ed10: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
ed20: 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
ed30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
ed40: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
ed50: 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
ed60: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
ed70: 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
ed80: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
ed90: 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
eda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
edb0: 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
edc0: 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
edd0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
ede0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edf0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ee00: 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
ee10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ee20: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
ee30: 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
ee40: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
ee50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ee60: 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
ee70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ee80: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
ee90: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
eea0: 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
eeb0: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
eec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
eed0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
eee0: 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
eef0: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
ef00: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
ef10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ef20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ef30: 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
ef40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ef50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
ef60: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ef70: 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
ef80: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ef90: 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
efa0: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
efb0: 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
efc0: 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
efd0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
efe0: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
eff0: 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
f000: 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
f010: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f020: 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
f030: 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
f040: 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
f050: 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
f060: 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
f070: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
f080: 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
f090: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f0a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
f0b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
f0c0: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
f0d0: 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
f0e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
f0f0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
f100: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
f110: 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
f120: 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
f130: 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
f140: 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
f150: 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
f160: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f170: 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
f180: 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
f190: 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
f1a0: 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
f1b0: 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
f1c0: 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
f1d0: 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
f1e0: 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
f1f0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
f200: 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
f210: 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
f220: 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
f230: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
f240: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
f250: 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
f260: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
f270: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
f280: 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
f290: 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
f2a0: 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
f2b0: 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
f2c0: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
f2d0: 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
f2e0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
f2f0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
f300: 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
f310: 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
f320: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
f330: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
f340: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
f350: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
f360: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
f370: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
f380: 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
f390: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
f3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f3b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
f3c0: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
f3d0: 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
f3e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f3f0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
f400: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
f410: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
f420: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f430: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
f440: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
f450: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
f460: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
f470: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f480: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
f490: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
f4a0: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
f4b0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f4c0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f4d0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f4e0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
f4f0: 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
f500: 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
f510: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
f520: 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
f530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
f540: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
f550: 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
f560: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f570: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
f580: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
f590: 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
f5a0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
f5b0: 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
f5c0: 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
f5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f5e0: 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
f5f0: 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
f600: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
f610: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
f620: 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28  rm[0])*n);.  if(
f630: 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75   paNew==0 ) retu
f640: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
f650: 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70  BKPT;.  memcpy(p
f660: 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
f670: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
f680: 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
f690: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
f6a0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f6b0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f6c0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f6d0: 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
f6e0: 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
f6f0: 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
f700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f710: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
f720: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
f730: 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
f740: 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
f750: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
f760: 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
f770: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f780: 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
f790: 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
f7a0: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f7b0: 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
f7c0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
f7d0: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
f7e0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
f7f0: 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
f800: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
f810: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f820: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f830: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
f840: 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
f850: 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
f860: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
f870: 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
f880: 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
f890: 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
f8a0: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
f8b0: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f8c0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f8d0: 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
f8e0: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
f8f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
f900: 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
f910: 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
f920: 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
f930: 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
f940: 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
f950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
f970: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f980: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
f990: 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
f9a0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
f9b0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f9c0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
f9d0: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
f9e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
f9f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
fa00: 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
fa10: 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
fa20: 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
fa30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fa40: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
fa50: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
fa60: 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
fa70: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
fa80: 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
fa90: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
faa0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
fab0: 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
fac0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i];.      if( pL
fad0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20  evel->pWLoop && 
fae0: 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
faf0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
fb00: 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20  _IN_ABLE) ){.   
fb10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fb20: 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
fb30: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
fb40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fb50: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
fb60: 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
fb70: 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
fb80: 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
fb90: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
fba0: 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
fbb0: 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
fbc0: 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
fbd0: 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
fbe0: 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
fbf0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
fc00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
fc10: 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
fc20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
fc30: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
fc40: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fc50: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
fc60: 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
fc70: 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
fc80: 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
fc90: 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
fca0: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
fcb0: 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69  .**   (3)  X ski
fcc0: 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  ps at least as m
fcd0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59  any columns as Y
fce0: 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
fcf0: 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
fd00: 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
fd10: 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
fd20: 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
fd30: 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
fd40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fd50: 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
fd60: 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
fd70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
fd80: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
fd90: 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
fda0: 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
fdb0: 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
fdc0: 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
fdd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
fde0: 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
fdf0: 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
fe00: 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
fe10: 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
fe20: 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
fe30: 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75  d.  The third ru
fe40: 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  le.** was added 
fe50: 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
fe60: 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
fe70: 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
fe80: 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
fe90: 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
fea0: 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
feb0: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
fec0: 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
fed0: 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
fee0: 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
fef0: 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
ff00: 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
ff10: 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
ff20: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
ff30: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
ff40: 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
ff50: 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
ff60: 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
ff70: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
ff80: 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
ff90: 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
ffa0: 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
ffb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ffc0: 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
ffd0: 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
ffe0: 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
fff0: 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
10000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10010 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
10020 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
10030 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
10040 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
10050 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
10060 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
10070 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
10080 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
10090 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
100a0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
100b0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
100c0 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
100d0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
100e0 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
100f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
10100 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
10110 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
10120 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
10130 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
10140 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
10150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10160 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
10170 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
10180 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
10190 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
101a0 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
101b0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
101c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
101d0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
101e0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
101f0 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
10200 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
10210 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
10220 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
10230 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
10240 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
10250 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
10260 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
10270 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
10280 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
10290 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
102a0 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
102b0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
102c0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
102d0 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
102e0 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
102f0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10300 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
10310 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
10320 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10330 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
10340 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
10350 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10360 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
10370 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
10380 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
10390 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
103a0 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
103b0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
103c0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
103d0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
103e0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
103f0 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
10400 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
10410 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10420 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
10430 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
10440 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
10450 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
10460 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
10470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10480 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
10490 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
104a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
104b0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
104c0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104d0 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
104e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
104f0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
10500 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
10510 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
10520 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
10530 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
10540 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10550 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10560 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10570 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10580 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10590 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
105a0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
105b0 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
105c0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
105d0 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
105e0 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
105f0 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10600 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10610 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
10620 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
10630 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10640 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
10650 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10660 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10670 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
10680 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
10690 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
106a0 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
106b0 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
106c0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
106d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
106e0 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
106f0 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
10700 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10730 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10740 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
10750 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
10760 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
10770 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
10780 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
10790 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
107a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
107b0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
107c0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
107d0 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
107e0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
107f0 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
10800 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
10810 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
10820 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
10830 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
10840 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
10850 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
10860 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
10870 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
10880 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
10890 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
108a0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
108b0 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
108c0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
108d0 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
108e0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
108f0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
10900 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
10910 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
10920 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
10930 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
10940 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
10950 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
10960 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
10970 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
10980 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
10990 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
109a0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
109b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
109c0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
109d0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
109e0 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
109f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
10a00 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
10a10 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
10a20 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
10a30 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
10a40 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
10a50 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
10a60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
10a70 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
10a80 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
10a90 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
10aa0 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
10ab0 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
10ac0 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
10ad0 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
10ae0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
10af0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
10b00 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
10b10 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
10b20 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
10b30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
10b40 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
10b50 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
10b60 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
10b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
10b80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
10b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
10ba0 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
10bb0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
10bc0 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
10bd0 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
10be0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
10bf0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
10c00 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
10c10 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
10c20 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
10c30 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
10c40 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
10c50 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
10c60 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
10c70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
10c80 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
10c90 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
10ca0 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
10cb0 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
10cc0 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
10cd0 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
10ce0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
10cf0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
10d00 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
10d10 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
10d20 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
10d30 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
10d40 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
10d50 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
10d60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10d70 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
10d80 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10d90 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
10da0 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
10db0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
10dc0 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
10dd0 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
10de0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
10df0 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
10e00 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
10e10 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
10e20 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
10e30 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
10e40 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
10e50 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
10e60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10e70 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
10e80 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
10e90 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
10ea0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10eb0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
10ec0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
10ed0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10ee0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
10ef0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
10f00 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
10f10 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
10f20 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
10f30 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
10f40 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
10f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10f60 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
10f70 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
10f80 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
10f90 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
10fa0 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
10fb0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
10fc0 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
10fd0 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
10fe0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
10ff0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
11000 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
11010 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
11020 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
11030 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
11040 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
11050 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
11060 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
11070 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
11080 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
11090 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
110a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
110b0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
110c0 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
110d0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
110e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
11110 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
11120 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
11150 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
11160 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
11170 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
11180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11190 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
111a0 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
111b0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
111c0 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
111d0 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
111e0 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
111f0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
11200 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
11210 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
11220 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
11230 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
11240 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
11250 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
11260 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
11270 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
11280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11290 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
112a0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
112b0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
112c0 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
112d0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
112e0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
112f0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11310 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
11320 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
11330 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11360 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
11370 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
11380 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
11390 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
113a0 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
113b0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
113c0 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
113d0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
113e0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
113f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11400 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
11410 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
11420 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
11430 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
11440 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
11450 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
11460 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
11470 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
11480 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
11490 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
114a0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
114b0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
114c0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
114d0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
114e0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
114f0 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
11500 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
11510 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
11520 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
11530 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
11540 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
11550 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
11560 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
11570 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
11580 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
11590 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
115a0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
115b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
115c0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
115d0 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
115e0 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
115f0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
11600 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
11610 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
11620 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
11630 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
11640 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
11650 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
11660 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
11670 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
11680 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
11690 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
116a0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
116b0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
116c0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
116d0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
116e0 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
116f0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
11700 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
11710 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
11720 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
11730 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
11740 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
11750 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
11760 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
11770 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
11780 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
11790 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
117a0 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
117b0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
117c0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
117d0 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
117e0 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
117f0 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
11800 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11810 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
11820 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
11830 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
11840 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
11850 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
11860 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
11870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11880 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
11890 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
118a0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
118b0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
118c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
118d0 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
118e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
118f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
11900 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
11910 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
11920 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
11930 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11940 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
11950 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
11960 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
11970 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
11980 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
11990 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
119a0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
119b0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a  late->nLTerm ){.
119c0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
119d0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36  NABLED.      u16
119e0 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
119f0 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20  OrSet->n;.      
11a00 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
11a10 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
11a20 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
11a30 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
11a40 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
11a50 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
11a80 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
11a90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11aa0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11ab0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ac0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11ad0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
11ae0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11af0 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
11b00 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
11b10 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
11b20 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
11b30 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
11b40 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
11b50 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  if.    }.    ret
11b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11b70 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
11b80 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
11b90 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
11ba0 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
11bb0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
11bc0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
11bd0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
11be0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
11bf0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
11c00 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
11c10 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11c20 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
11c30 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
11c40 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
11c50 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
11c60 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
11c70 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
11c80 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
11c90 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
11ca0 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
11cb0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11cc0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11ce0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11cf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11d00 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11d10 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
11d20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
11d30 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
11d40 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
11d50 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
11d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
11d80 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
11d90 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11da0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
11db0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
11dc0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
11dd0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
11de0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
11df0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
11e00 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
11e10 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
11e20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
11e30 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
11e40 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
11e50 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11e60 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
11e70 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11e80 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
11e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11ea0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
11eb0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
11ec0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11ed0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
11ee0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
11ef0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11f00 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
11f10 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11f20 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11f30 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
11f40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
11f50 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
11f60 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
11f70 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
11f80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11f90 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
11fa0 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
11fb0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
11fc0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
11fd0 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
11fe0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11ff0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12000 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
12010 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
12020 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
12030 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
12040 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
12050 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
12060 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
12070 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
12080 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
12090 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
120a0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
120b0 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
120c0 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
120d0 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
120e0 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
120f0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
12100 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
12110 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
12120 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
12130 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
12140 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
12150 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
12160 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
12170 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
12180 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
12190 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
121a0 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
121b0 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
121c0 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
121d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
121e0 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
121f0 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
12200 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12210 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
12220 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12230 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
12250 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
12260 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
12270 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
12280 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
12290 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
122a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
122b0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
122c0 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
122d0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
122e0 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
122f0 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  late);.  if( (p-
12300 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
12310 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
12320 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
12330 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
12340 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
12350 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
12360 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
12370 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
12380 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
12390 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
123a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
123b0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
123c0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
123d0 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
123e0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
123f0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
12400 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
12410 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
12420 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
12430 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
12440 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
12450 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
12460 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
12470 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
12480 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
12490 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
124a0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
124b0 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
124c0 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
124d0 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
124e0 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
124f0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
12500 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
12510 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
12520 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
12530 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
12540 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
12550 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
12560 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12570 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
12580 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
12590 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
125a0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
125b0 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
125c0 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
125d0 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
125e0 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
125f0 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
12600 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
12610 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
12620 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
12630 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
12640 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
12650 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
12660 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
12670 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
12680 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
12690 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
126a0 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
126b0 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
126c0 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
126d0 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
126e0 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
126f0 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
12700 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
12710 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
12720 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
12730 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
12740 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
12750 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
12760 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
12770 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
12780 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
12790 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
127a0 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
127b0 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
127c0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
127d0 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
127e0 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
127f0 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
12800 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
12810 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
12820 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
12830 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
12840 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
12850 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
12860 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
12870 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
12880 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
12890 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
128a0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
128b0 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
128c0 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
128d0 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
128e0 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
128f0 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
12900 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
12910 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
12920 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
12930 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
12940 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
12950 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
12960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12970 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
12980 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
12990 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
129a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
129b0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
129c0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
129d0 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
129e0 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
129f0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
12a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12a10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
12a20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
12a30 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
12a40 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
12a50 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
12a60 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
12a70 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
12a80 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
12a90 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
12aa0 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
12ab0 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
12ac0 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
12ad0 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
12ae0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
12af0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
12b00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
12b10 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
12b20 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
12b30 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
12b40 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
12b50 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
12b60 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
12b70 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
12b80 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12b90 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
12ba0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
12bb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12bc0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
12bd0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
12be0 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
12bf0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
12c00 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
12c10 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
12c20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
12c30 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
12c40 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
12c50 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
12c60 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
12c70 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
12c80 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
12c90 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
12ca0 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
12cb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
12cc0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
12cd0 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
12ce0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
12cf0 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
12d00 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
12d10 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
12d20 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
12d30 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
12d40 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
12d50 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
12d60 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
12d70 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
12d80 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
12d90 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
12da0 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
12db0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
12dc0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
12dd0 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
12de0 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
12df0 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
12e00 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
12e10 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
12e20 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
12e30 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
12e40 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
12e50 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
12e60 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
12e70 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IS) ){.         
12e80 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
12e90 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
12ea0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
12eb0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
12ec0 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
12ed0 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  S );.          i
12ee0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12ef0 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
12f00 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
12f10 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
12f20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
12f30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12f40 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
12f50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
12f60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
12f70 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
12f80 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
12f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12fa0 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
12fb0 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
12fc0 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
12fd0 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
12fe0 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  ce;.}../*.** Adj
12ff0 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
13000 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
13010 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
13020 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
13030 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
13040 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
13050 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
13060 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13070 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
13080 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
13090 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
130a0 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
130b0 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
130c0 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
130d0 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
130e0 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
130f0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
13100 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
13110 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
13120 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
13130 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
13140 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
13150 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13160 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
13170 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
13180 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
13190 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
131a0 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
131b0 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
131c0 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
131d0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
131e0 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
131f0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
13200 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
13210 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
13220 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
13230 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
13240 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
13250 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
13260 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
13270 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
13280 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
13290 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
132a0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
132b0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
132c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
132d0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
132e0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
132f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
13300 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
13310 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
13320 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
13330 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
13340 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
13350 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
13360 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
13370 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
133a0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
133b0 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
133c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
133d0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
133e0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
133f0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
13400 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
13410 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
13420 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
13430 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13440 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13450 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
13460 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13470 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
13480 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
13490 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134b0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
134c0 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
134d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
134e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13500 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
13510 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
13520 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
13550 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
13560 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
13570 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13590 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
135a0 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
135b0 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
135c0 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
135d0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
135e0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
135f0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13600 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
13610 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13620 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13630 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
13640 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
13650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13660 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13670 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
13680 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
13690 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
136a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
136b0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
136c0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
136d0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136f0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
13700 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
13710 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
13720 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
13730 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
13740 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
13750 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
13760 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13780 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
13790 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
137c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
137d0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
137e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
137f0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
13800 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
13810 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13820 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
13830 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
13840 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
13850 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
13860 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
13870 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
13880 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
13890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
138a0 5f 42 4b 50 54 3b 0a 0a 20 20 61 73 73 65 72 74  _BKPT;..  assert
138b0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
138c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
138d0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
138e0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
138f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
13900 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
13910 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
13920 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
13930 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
13940 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
13950 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a  ;.  }else if( /*
13960 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
13970 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a  ||*/ (pSrc->fg.j
13980 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
13990 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d  T)!=0 ){.    opM
139a0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
139b0 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
139c0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
139d0 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d  se{.    opMask =
139e0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
139f0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
13a00 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
13a10 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
13a20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
13a30 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
13a40 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
13a50 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
13a60 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
13a70 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
13a80 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
13a90 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
13aa0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
13ab0 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65  aved_nSkip = pNe
13ac0 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  w->nSkip;.  save
13ad0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
13ae0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
13af0 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
13b00 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
13b10 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
13b20 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
13b30 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
13b40 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68  ut;.  pTerm = wh
13b50 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
13b60 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
13b70 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
13b80 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20   saved_nEq,.    
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
13bb0 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  be);.  pNew->rSe
13bc0 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65  tup = 0;.  rSize
13bd0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
13be0 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f  LogEst[0];.  rLo
13bf0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
13c00 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72  Size);.  for(; r
13c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13c20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
13c30 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
13c40 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
13c50 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
13c60 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
13c70 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
13c80 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
13c90 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
13ca0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
13cb0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
13cc0 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
13cd0 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
13ce0 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
13cf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
13d00 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13d10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
13d20 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
13d30 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13d40 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
13d60 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
13d70 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
13d80 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
13d90 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65  =0).     && inde
13da0 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
13db0 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
13dc0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
13dd0 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
13de0 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
13df0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13e00 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
13e10 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
13e20 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
13e30 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
13e40 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
13e50 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ;..    /* Do not
13e60 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72   allow the upper
13e70 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45   bound of a LIKE
13e80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61   optimization ra
13e90 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  nge constraint. 
13ea0 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74     ** to mix wit
13eb0 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20  h a lower range 
13ec0 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20  bound from some 
13ed0 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a  other source */.
13ee0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
13ef0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
13f00 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e  KEOPT && pTerm->
13f10 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54  eOperator==WO_LT
13f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
13f30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
13f40 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
13f50 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
13f60 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
13f70 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  Eq;.    pNew->nL
13f80 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
13f90 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
13fa0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
13fb0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
13fc0 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
13fd0 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
13fe0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
13ff0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
14000 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
14010 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
14020 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
14030 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
14040 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
14050 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
14060 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
14070 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14080 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
14090 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
140a0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
140b0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
140c0 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
140d0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
140e0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
140f0 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
14100 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
14110 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
14120 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
14130 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
14140 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
14150 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
14160 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
14170 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14180 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
14190 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
141a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
141b0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
141c0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
141d0 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
141e0 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
141f0 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
14200 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
14210 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
14220 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
14230 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
14240 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
14250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
14260 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
14270 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
14280 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
14290 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
142a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
142b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
142c0 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f  ert( nIn>0 );  /
142d0 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73  * RHS always has
142e0 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73   2 or more terms
142f0 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a  ...  The parser.
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67          ** chang
14320 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e  es "x IN (?)" in
14330 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20  to "x=?". */..  
14340 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
14350 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  & (WO_EQ|WO_IS) 
14360 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
14370 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
14380 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b  lumn[saved_nEq];
14390 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
143a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
143b0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61  LUMN_EQ;.      a
143c0 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71  ssert( saved_nEq
143d0 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ==pNew->u.btree.
143e0 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nEq );.      if(
143f0 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
14400 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c  .       || (iCol
14410 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20  >0 && nInMul==0 
14420 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
14430 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
14440 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14450 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
14460 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74   pProbe->uniqNot
14470 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
14480 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14490 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
144a0 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
144b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
144c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
144d0 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
14500 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
14510 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
14520 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14530 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
14540 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
14550 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
14560 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
14570 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
14580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14590 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
145a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
145b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
145c0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
145d0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
145e0 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
145f0 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
14600 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14610 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
14620 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
14630 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
14640 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
14650 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
14660 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
14670 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
14680 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
14690 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
146a0 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
146b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
146c0 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
146d0 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
146e0 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
146f0 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
14700 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
14710 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
14720 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
14730 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
14740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
14750 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
14760 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
14770 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
14780 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
14790 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
147a0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
147b0 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
147c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
147d0 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
147e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
147f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
14800 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
14810 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
14820 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14830 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
14840 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
14850 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
14860 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
14870 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
14880 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
14890 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
148a0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
148b0 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
148c0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
148d0 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14900 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
14910 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
14920 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
14930 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
14940 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
14950 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14960 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
14970 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
14980 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
14990 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
149a0 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
149b0 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
149c0 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
149d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
149e0 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
149f0 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
14a00 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
14a10 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
14a20 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
14a30 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
14a40 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
14a50 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
14a60 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
14a70 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
14a80 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
14a90 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
14aa0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
14ab0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
14ac0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
14ad0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14ae0 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
14af0 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
14b00 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
14b10 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
14b20 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
14b30 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
14b40 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
14b50 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
14b60 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
14b70 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
14b80 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
14b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ba0 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
14bb0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
14bd0 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
14be0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
14bf0 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
14c00 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
14c10 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
14c20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14c30 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
14c40 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
14c50 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
14c60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14c70 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
14c80 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
14c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14ca0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
14cb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14cc0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
14cd0 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
14ce0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
14cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
14d00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14d10 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14d20 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
14d30 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
14d40 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
14d50 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
14d60 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
14d70 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
14d80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
14d90 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
14da0 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
14db0 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
14dc0 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
14dd0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
14de0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
14df0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
14e00 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
14e10 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
14e20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14e30 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
14e40 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
14e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14e60 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14e70 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
14e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14e90 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14eb0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14ec0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
14ed0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
14ee0 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
14ef0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
14f00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
14f10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14f30 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
14f40 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14f50 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
14f60 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
14f70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14f80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14f90 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
14fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
14fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
14fd0 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
14fe0 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
14ff0 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
15000 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
15010 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15020 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
15030 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
15040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15050 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
15060 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
15070 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
15080 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
15090 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
150a0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
150b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150c0 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
150d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
150e0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
150f0 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
15100 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
15110 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
15120 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
15130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
15140 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
15160 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
15170 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
15180 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
15190 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
151a0 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
151b0 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
151c0 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
151d0 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
151e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
151f0 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
15200 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
15210 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
15220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
15240 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
15250 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
15260 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
15270 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
15280 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
15290 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
152a0 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
152b0 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
152c0 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
152d0 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
152e0 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
152f0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
15300 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
15310 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
15320 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
15330 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
15340 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
15350 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
15360 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
15370 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
15380 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
15390 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
153a0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
153b0 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
153c0 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
153d0 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
153e0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
153f0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
15400 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
15410 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
15420 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
15430 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
15440 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
15450 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
15460 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
15470 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
15480 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
15490 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
154a0 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
154b0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
154c0 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
154d0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
154e0 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
154f0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
15500 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
15510 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
15520 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
15530 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
15540 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
15550 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
15560 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15570 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
15580 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
15590 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
155a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
155c0 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
155d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
155e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
155f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
15600 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
15610 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
15620 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
15630 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
15640 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
15650 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
15660 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
15670 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
15680 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
15690 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
156a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
156b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
156c0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
156d0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
156e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
156f0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
15700 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
15710 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
15720 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
15730 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
15740 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
15750 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
15760 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
15770 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15780 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
15790 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
157a0 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  rm;..  /* Consid
157b0 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
157c0 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
157d0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
157e0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
157f0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
15800 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
15810 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
15820 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
15830 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
15840 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
15850 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
15860 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
15870 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  18. .  **.  ** T
15880 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20  he magic number 
15890 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f  18 is selected o
158a0 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74  n the basis that
158b0 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77   scanning 17 row
158c0 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74  s.  ** is almost
158d0 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20   always quicker 
158e0 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65  than an index se
158f0 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20  ek (even though 
15900 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  if the index.  *
15910 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  * contains fewer
15920 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20   than 2^17 rows 
15930 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77  we assume otherw
15940 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72  ise in other par
15950 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ts of.  ** the c
15960 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20  ode). And, even 
15970 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  if it is not, it
15980 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74   should not be t
15990 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20  oo much slower. 
159a0 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68  .  ** On the oth
159b0 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74  er hand, the ext
159c0 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65  ra seeks could e
159d0 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e  nd up being sign
159e0 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d  ificantly.  ** m
159f0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20  ore expensive.  
15a00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d  */.  assert( 42=
15a10 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
15a20 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65  8) );.  if( save
15a30 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
15a40 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
15a50 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
15a60 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
15a70 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30  e->noSkipScan==0
15a80 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
15a90 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
15aa0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
15ab0 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
15ac0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
15ad0 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
15ae0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
15af0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
15b00 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
15b10 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
15b20 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
15b30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
15b40 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  +;.    pNew->nSk
15b50 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ip++;.    pNew->
15b60 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
15b70 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  erm++] = 0;.    
15b80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15b90 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b   WHERE_SKIPSCAN;
15ba0 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72  .    nIter = pPr
15bb0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15bc0 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50  [saved_nEq] - pP
15bd0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15be0 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a  t[saved_nEq+1];.
15bf0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
15c00 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
15c10 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
15c20 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
15c30 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
15c40 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
15c50 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
15c60 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
15c70 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
15c80 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
15c90 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
15ca0 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
15cb0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
15cc0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
15cd0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
15ce0 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
15cf0 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
15d00 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
15d10 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
15d20 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
15d30 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
15d40 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
15d50 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  kip;.    pNew->w
15d60 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
15d70 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72  sFlags;.  }..  r
15d80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15d90 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
15da0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
15db0 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
15dc0 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
15dd0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
15de0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
15df0 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
15e00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
15e10 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
15e20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
15e30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
15e40 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
15e50 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
15e60 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
15e70 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
15e80 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
15e90 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
15ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
15eb0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
15ec0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
15ed0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
15ee0 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
15ef0 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
15f00 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
15f10 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69  t *pOB;.  ExprLi
15f20 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20  st *aColExpr;.  
15f30 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69  int ii, jj;..  i
15f40 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  f( pIndex->bUnor
15f50 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30  dered ) return 0
15f60 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70  ;.  if( (pOB = p
15f70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
15f80 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20  >pOrderBy)==0 ) 
15f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
15fa0 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45  ii=0; ii<pOB->nE
15fb0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
15fc0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71  Expr *pExpr = sq
15fd0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
15fe0 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e  late(pOB->a[ii].
15ff0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
16000 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
16010 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
16020 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
16030 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
16040 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
16050 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
16060 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
16070 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
16080 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16090 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
160a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
160b0 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
160c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
160d0 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72  se if( (aColExpr
160e0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45   = pIndex->aColE
160f0 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)!=0 ){.     
16100 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
16110 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
16120 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16130 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
16140 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20  mn[jj]!=XN_EXPR 
16150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16170 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
16180 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d  ,aColExpr->a[jj]
16190 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d  .pExpr,iCursor)=
161a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
161b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
161c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
161d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
161e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
161f0 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
16200 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
16210 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
16220 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
16230 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
16240 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
16250 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
16260 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
16270 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
16280 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
16290 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
162a0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
162b0 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
162c0 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
162d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
162e0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
162f0 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
16300 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
16310 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
16320 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
16330 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
16340 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
16350 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
16360 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
16370 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
16380 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
16390 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
163a0 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
163b0 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
163c0 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
163d0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
163e0 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
163f0 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
16400 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
16410 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
16420 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
16430 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
16440 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
16450 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
16460 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
16470 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
16480 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  Term;.  while( p
16490 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
164a0 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68  D ){.    if( !wh
164b0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
164c0 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70  Index(iTab,pWC,p
164d0 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20  Where->pLeft) ) 
164e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57  return 0;.    pW
164f0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
16500 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  Right;.  }.  for
16510 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
16520 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
16530 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
16540 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
16550 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
16560 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16570 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
16580 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
16590 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21  Tab) .     && (!
165a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
165b0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
165c0 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
165d0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
165e0 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
165f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16600 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
16610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
16620 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
16630 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
16640 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
16650 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
16660 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
16670 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
16680 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
16690 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
166a0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
166b0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
166c0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
166d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
166e0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
166f0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
16700 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
16710 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
16720 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
16730 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
16740 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
16750 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
16760 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
16770 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
16780 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
16790 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
167a0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
167b0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
167c0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
167d0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
16800 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
16810 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16820 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
16830 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
16840 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
16850 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
16860 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
16870 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
16880 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
16890 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
168a0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
168b0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
168c0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
168d0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
168e0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
168f0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
16900 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16910 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
16920 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
16930 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
16940 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16950 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
16960 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
16970 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
16980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
16990 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
169a0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
169b0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
169c0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
169d0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
169e0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
169f0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
16a00 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
16a10 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
16a20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
16a30 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
16a40 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
16a50 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
16a60 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
16a70 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
16a80 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
16a90 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
16aa0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
16ab0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
16ac0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
16ad0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
16ae0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
16af0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
16b00 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
16b10 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
16b20 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
16b30 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
16b40 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
16b50 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
16b60 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
16b70 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
16b80 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
16b90 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
16ba0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
16bb0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
16bc0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
16bd0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
16be0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
16bf0 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
16c00 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
16c10 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
16c20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
16c30 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
16c40 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
16c50 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
16c60 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
16c70 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
16c80 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
16c90 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
16ca0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
16cb0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
16cc0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
16cd0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
16ce0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
16cf0 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
16d00 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16d10 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
16d20 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
16d30 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
16d40 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
16d50 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
16d60 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
16d70 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
16d80 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
16d90 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
16da0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
16db0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
16dc0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16de0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
16df0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
16e00 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
16e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e20 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
16e30 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
16e40 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
16e50 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
16e60 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
16e70 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
16e80 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
16e90 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
16ea0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
16eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
16ec0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
16ed0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16ee0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
16ef0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
16f00 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
16f10 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16f20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
16f30 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
16f40 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
16f50 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
16f60 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
16f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
16f80 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
16f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
16fb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16fc0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
16fd0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
16fe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16ff0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
17000 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
17010 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
17020 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
17030 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17050 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17060 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
17070 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
17080 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17090 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
170a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
170b0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
170c0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
170d0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
170e0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
170f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
17100 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
17110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
17120 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
17130 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
17140 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
17150 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
17160 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
17170 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
17180 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
17190 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
171a0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
171b0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
171c0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
171d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
171e0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
171f0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
17200 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
17210 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
17220 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
17230 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
17240 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
17250 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
17260 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
17270 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
17280 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
17290 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
172a0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
172b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
172c0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
172d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
172e0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
172f0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
17300 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
17310 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
17320 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
17330 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
17340 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
17350 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
17360 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
17370 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
17380 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
17390 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
173a0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
173b0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
173c0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
173d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
173e0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
173f0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
17400 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
17410 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
17420 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
17430 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
17440 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
17450 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
17460 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
17470 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
17480 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
17490 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
174a0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
174b0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
174c0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
174d0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
174e0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
174f0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
17500 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
17510 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
17520 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
17530 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
17540 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
17550 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
17560 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
17570 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
17580 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
17590 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
175a0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
175b0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
175c0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
175d0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
175e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
175f0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
17600 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
17610 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
17620 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
17630 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
17640 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
17650 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
17660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17670 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
17680 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
17690 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
176a0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
176b0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
176c0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
176d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
176e0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
176f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
17700 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29  RE_NO_AUTOINDEX)
17710 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
17720 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
17730 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
17740 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
17750 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
17760 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
17770 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
17780 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
17790 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
177a0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
177b0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
177c0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
177d0 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
177e0 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
177f0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
17800 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
17810 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
17820 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
17830 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
17840 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
17850 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
17860 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
17870 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
17880 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
17890 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
178a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
178b0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
178c0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
178d0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
178e0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
178f0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
17900 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
17910 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
17920 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
17930 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
17940 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
17950 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
17960 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
17970 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
17980 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
17990 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
179a0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
179b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
179c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
179d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
179e0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
179f0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
17a00 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
17a10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
17a20 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
17a30 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
17a40 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
17a50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
17a60 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
17a70 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
17a80 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
17a90 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
17aa0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
17ab0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
17ac0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17ad0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
17ae0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
17af0 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
17b00 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
17b10 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
17b20 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
17b30 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
17b40 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
17b50 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
17b60 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
17b70 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
17b80 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
17b90 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
17ba0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
17bb0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
17bc0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
17bd0 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
17be0 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
17bf0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
17c00 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
17c10 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
17c20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
17c30 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
17c40 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
17c50 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
17c60 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
17c70 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
17c80 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
17c90 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
17ca0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
17cb0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
17cc0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
17cd0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
17ce0 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
17cf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17d00 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
17d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
17d20 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
17d30 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
17d40 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
17d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
17d60 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
17d70 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
17d80 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17d90 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
17da0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
17db0 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
17dc0 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
17dd0 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
17de0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
17df0 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65  knowing how sele
17e00 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
17e10 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
17e20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20  be.  It would.  
17e30 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
17e40 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20  unreasonable to 
17e50 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20  make this value 
17e60 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a  much larger. */.
17e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17e80 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74  ut = 43;  assert
17e90 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 43==sqlite3Log
17ea0 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  Est(20) );.     
17eb0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17ec0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17ed0 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
17ee0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
17ef0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
17f00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
17f10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
17f20 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c  rereq = mExtra |
17f30 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
17f40 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
17f50 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
17f60 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
17f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17f80 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
17f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
17fa0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
17fb0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
17fc0 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
17fd0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
17fe0 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
17ff0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
18000 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
18010 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
18020 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
18030 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
18040 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
18050 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
18060 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
18070 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
18080 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
18090 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
180a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
180b0 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
180c0 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
180d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
180e0 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
180f0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
18100 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
18110 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
18120 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
18130 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
18140 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18150 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18160 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
18170 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
18180 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
18190 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
181a0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
181b0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
181c0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
181d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
181e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
181f0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
18200 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
18210 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
18220 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
18230 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
18240 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
18250 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
18260 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
18270 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
18280 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
18290 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
182a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
182b0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
182c0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
182d0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
182e0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
182f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
18300 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
18310 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
18320 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
18330 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
18340 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
18350 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
18360 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
18370 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
18380 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
18390 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
183a0 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
183b0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
183c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
183d0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70   + 16;.      App
183e0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
183f0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
18400 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
18410 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
18420 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
18430 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
18440 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18450 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18460 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
18470 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
18480 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  e;.      if( rc 
18490 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
184a0 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
184b0 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k m;.      if( p
184c0 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e  Probe->isCoverin
184d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  g ){.        pNe
184e0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
184f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
18500 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
18510 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20       m = 0;.    
18520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18530 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
18540 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
18550 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20  ndex(pProbe);.  
18560 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
18570 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
18580 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
18590 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
185a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
185b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
185c0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
185d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
185e0 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48  ( b.       || !H
185f0 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
18600 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
18610 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
18620 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
18630 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
18640 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
18650 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
18660 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
18670 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
18680 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
18690 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
186a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
186b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
186c0 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
186d0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
186e0 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
186f0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
18700 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
18710 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
18720 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
18730 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
18740 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
18750 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
18760 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
18770 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
18780 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
18790 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
187a0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
187b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
187c0 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
187d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
187e0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
187f0 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69   rows. If this i
18800 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
18810 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20   index scan,.   
18820 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64       ** also add
18830 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
18840 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73  iting table rows
18850 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20   (N*3.0).  */.  
18860 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
18870 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28   = rSize + 1 + (
18880 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
18890 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62  Row)/pTab->szTab
188a0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Row;.        if(
188b0 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m!=0 ){.       
188c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
188d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
188e0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69  (pNew->rRun, rSi
188f0 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20  ze+16);.        
18900 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
18910 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
18920 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
18930 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
18940 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
18950 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
18960 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
18970 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
18980 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
18990 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
189a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
189b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
189c0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
189d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
189e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
189f0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
18a00 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
18a10 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
18a20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18a30 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
18a40 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
18a50 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
18a60 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
18a70 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
18a80 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
18a90 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
18aa0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
18ab0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
18ac0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
18ad0 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
18ae0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
18af0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
18b00 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
18b10 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  IBIndex ) break;
18b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18b30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18b40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18b50 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  TABLE../*.** Arg
18b60 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69  ument pIdxInfo i
18b70 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
18b80 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  ted with all con
18b90 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61  straints that ma
18ba0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20  y.** be used by 
18bb0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
18bc0 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
18bd0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
18be0 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75  iTab. This.** fu
18bf0 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
18c00 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63  ubset of those c
18c10 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c  onstraints usabl
18c20 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  e, invokes the.*
18c30 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  * xBestIndex met
18c40 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65  hod and adds the
18c50 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74   returned plan t
18c60 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
18c70 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  * A constraint i
18c80 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20  s marked usable 
18c90 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72  if:.**.**   * Ar
18ca0 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69  gument mUsable i
18cb0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74  ndicates that it
18cc0 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  s prerequisites 
18cd0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61  are available, a
18ce0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20  nd.**.**   * It 
18cf0 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68  is not one of th
18d00 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63  e operators spec
18d10 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78  ified in the mEx
18d20 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65  clude mask passe
18d30 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20  d.**     as the 
18d40 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
18d50 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69  (which in practi
18d60 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f  ce is either WO_
18d70 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  IN or 0)..**.** 
18d80 41 72 67 75 6d 65 6e 74 20 6d 45 78 74 72 61 20  Argument mExtra 
18d90 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62  is a mask of tab
18da0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
18db0 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
18dc0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
18dd0 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
18de0 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65  . These are adde
18df0 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70  d to the plans p
18e00 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20  rerequisites.** 
18e10 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64  before it is add
18e20 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  ed to pBuilder..
18e30 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72  **.** Output par
18e40 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20  ameter *pbIn is 
18e50 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
18e60 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f  he plan added to
18e70 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65   pBuilder.** use
18e80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f  s one or more WO
18e90 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61  _IN terms, or fa
18ea0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
18eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18ec0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
18ed0 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  One(.  WhereLoop
18ee0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
18ef0 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  r,.  Bitmask mEx
18f00 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
18f10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
18f20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  tables that must
18f30 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42   be used. */.  B
18f40 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20  itmask mUsable, 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f60 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65  * Mask of usable
18f70 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 75 31   prereqs */.  u1
18f80 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20  6 mExclude,     
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fa0 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 66   Exclude terms f
18fb0 6f 72 20 74 68 69 73 20 6f 70 65 72 61 74 6f 72  or this operator
18fc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
18fd0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
18fe0 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
18ff0 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
19000 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  estIndex */.  in
19010 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19030 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
19040 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
19050 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
19060 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
19070 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
19080 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
19090 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
190a0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
190b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
190c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
190d0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
190e0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
190f0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
19100 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
19110 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19120 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
19130 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
19140 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
19150 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
19160 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
19170 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
19180 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19190 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
191a0 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
191b0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
191c0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
191d0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
191e0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
191f0 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
19200 20 26 20 6d 45 78 74 72 61 29 3d 3d 6d 45 78 74   & mExtra)==mExt
19210 72 61 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20  ra );.  *pbIn = 
19220 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  0;.  pNew->prere
19230 71 20 3d 20 6d 45 78 74 72 61 3b 0a 0a 20 20 2f  q = mExtra;..  /
19240 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65  * Set the usable
19250 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62   flag on the sub
19260 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  set of constrain
19270 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ts identified by
19280 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73   .  ** arguments
19290 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78   mUsable and mEx
192a0 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78  clude. */.  pIdx
192b0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
192c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
192d0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
192e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
192f0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
19300 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
19310 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
19320 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
19330 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49  erm = &pWC->a[pI
19340 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
19350 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  set];.    pIdxCo
19360 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
19370 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19380 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
19390 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70  sable)==pTerm->p
193a0 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20  rereqRight .    
193b0 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
193c0 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65  rator & mExclude
193d0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
193e0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
193f0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
19400 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
19410 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ze the output fi
19420 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69  elds of the sqli
19430 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
19440 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65  tructure */.  me
19450 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
19460 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
19470 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  )*nConstraint);.
19480 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
19490 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
194a0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
194b0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
194c0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  );.  pIdxInfo->i
194d0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
194e0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
194f0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  0;.  pIdxInfo->n
19500 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
19510 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
19520 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
19530 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
19540 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
19550 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
19560 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
19570 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19580 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
19590 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
195a0 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  gs = 0;.  pIdxIn
195b0 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73  fo->colUsed = (s
195c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72  qlite3_int64)pSr
195d0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f  c->colUsed;..  /
195e0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72  * Invoke the vir
195f0 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74  tual table xBest
19600 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a  Index() method *
19610 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73  /.  rc = vtabBes
19620 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
19630 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49  Src->pTab, pIdxI
19640 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nfo);.  if( rc )
19650 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d   return rc;..  m
19660 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73  xTerm = -1;.  as
19670 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
19680 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
19690 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
196a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
196b0 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
196c0 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  ] = 0;.  pNew->u
196d0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
196e0 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   0;.  pIdxCons =
196f0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
19700 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
19710 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
19720 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
19730 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
19740 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
19750 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  Cons++){.    int
19760 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20   iTerm;.    if( 
19770 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
19780 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
19790 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )>=0 ){.      Wh
197a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
197b0 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49        int j = pI
197c0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
197d0 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  set;.      if( i
197e0 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
197f0 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a  t.       || j<0.
19800 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
19810 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c  ->nTerm.       |
19820 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
19830 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 29  Term]!=0.      )
19840 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
19850 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
19860 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19870 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
19880 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c  xBestIndex() mal
19890 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
198a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
198b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
198c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
198d0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
198e0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
198f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19900 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
19910 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
19920 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
19930 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
19940 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
19950 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
19960 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
19970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
19980 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
19990 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
199a0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
199b0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
199c0 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
199d0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
199e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
199f0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
19a00 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19a10 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
19a20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
19a30 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
19a40 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
19a50 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
19a60 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
19a70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19a80 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
19a90 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
19aa0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
19ab0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
19ac0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
19ad0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
19ae0 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
19af0 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
19b00 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
19b10 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
19b20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
19b30 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
19b40 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
19b50 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
19b60 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
19b70 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
19b80 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
19b90 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
19ba0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
19bb0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
19bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
19bd0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
19be0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
19bf0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
19c00 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
19c10 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
19c20 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
19c30 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  In = 1;.      }.
19c40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4e 65      }.  }..  pNe
19c50 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
19c60 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rm+1;.  assert( 
19c70 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
19c80 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
19c90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
19ca0 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
19cb0 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e  idxNum;.  pNew->
19cc0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19cd0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
19ce0 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
19cf0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
19d00 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
19d10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
19d20 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
19d30 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77  ->idxStr;.  pNew
19d40 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
19d50 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
19d60 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
19d70 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78  med ?.      pIdx
19d80 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
19d90 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65   0);.  pNew->rSe
19da0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
19db0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
19dc0 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
19dd0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19de0 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77  tedCost);.  pNew
19df0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
19e00 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
19e10 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
19e20 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57  ..  /* Set the W
19e30 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67  HERE_ONEROW flag
19e40 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
19e50 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69  ex() method indi
19e60 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  cated.  ** that 
19e70 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
19e80 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  sit at most one 
19e90 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74  row. Clear it ot
19ea0 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66  herwise. */.  if
19eb0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46  ( pIdxInfo->idxF
19ec0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e  lags & SQLITE_IN
19ed0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20  DEX_SCAN_UNIQUE 
19ee0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ){.    pNew->wsF
19ef0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
19f00 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EROW;.  }else{. 
19f10 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19f20 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f   &= ~WHERE_ONERO
19f30 57 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  W;.  }.  whereLo
19f40 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
19f50 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
19f60 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
19f70 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
19f80 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
19f90 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
19fa0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
19fb0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
19fc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
19fe0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
19ff0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1a000 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
1a010 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
1a020 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
1a030 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
1a040 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
1a050 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
1a060 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
1a070 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1a080 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
1a090 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
1a0a0 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45  e query, both mE
1a0b0 78 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75  xtra and.** mUnu
1a0c0 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f  sable are set to
1a0d0 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d   0. Otherwise, m
1a0e0 45 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20  Extra is a mask 
1a0f0 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1a100 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1a110 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1a120 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a130 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1a140 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1a150 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1a160 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1a170 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1a180 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1a190 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1a1a0 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1a1b0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1a1c0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1a1d0 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1a1e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1a1f0 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1a200 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1a210 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1a220 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1a230 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1a240 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1a250 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1a260 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1a270 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1a280 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1a290 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1a2a0 6e 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70  n mExtra corresp
1a2b0 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29  onds to (t1, t2)
1a2c0 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74   and mUnusable t
1a2d0 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a  o (t5, t6)..**.*
1a2e0 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  * All the tables
1a2f0 20 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20   in mExtra must 
1a300 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1a310 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
1a320 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
1a330 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
1a340 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
1a350 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
1a360 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
1a370 45 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65  Extra may be spe
1a380 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1a390 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1a3a0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1a3b0 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1a3c0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1a3d0 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1a3e0 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1a3f0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1a400 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1a410 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1a420 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1a430 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1a440 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1a450 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1a460 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1a470 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1a480 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1a490 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1a4a0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1a4b0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1a4c0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1a4d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1a4e0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1a4f0 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20  mask mExtra,    
1a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1a510 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1a520 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1a530 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1a540 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1a550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1a560 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1a570 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1a580 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1a590 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a5a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1a5b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1a5c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1a5d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1a5e0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1a5f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1a600 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a620 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1a630 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1a640 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1a650 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1a660 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1a670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a680 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1a690 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1a6a0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1a6b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1a6c0 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1a6d0 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1a6e0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1a6f0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1a700 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1a710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1a720 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1a730 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1a760 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1a770 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1a780 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1a790 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7b0 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1a7c0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1a7d0 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
1a7e0 28 6d 45 78 74 72 61 20 26 20 6d 55 6e 75 73 61  (mExtra & mUnusa
1a7f0 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1a800 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1a810 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1a820 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1a830 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1a840 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1a850 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1a860 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1a870 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1a880 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1a890 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1a8a0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1a8b0 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1a8c0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1a8d0 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1a8e0 20 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e   pSrc,pBuilder->
1a8f0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
1a900 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1a910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1a920 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
1a930 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
1a940 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
1a950 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
1a960 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
1a970 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a980 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e  eedFree = 0;.  n
1a990 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e  Constraint = p->
1a9a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
1a9b0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
1a9c0 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
1a9d0 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
1a9e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1a9f0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1aa00 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72  b, p);.    retur
1aa10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1aa20 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  KPT;.  }..  /* F
1aa30 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49  irst call xBestI
1aa40 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1aa50 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1aa60 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 77 68  le. */.  rc = wh
1aa70 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1aa80 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1aa90 45 78 74 72 61 2c 20 28 42 69 74 6d 61 73 6b 29  Extra, (Bitmask)
1aaa0 28 2d 31 29 2c 20 30 2c 20 70 2c 20 26 62 49 6e  (-1), 0, p, &bIn
1aab0 29 3b 0a 20 20 6d 42 65 73 74 20 3d 20 70 4e 65  );.  mBest = pNe
1aac0 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 45 78  w->prereq & ~mEx
1aad0 74 72 61 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  tra;..  /* If th
1aae0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1aaf0 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1ab00 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1ab10 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1ab20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1ab30 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1ab40 72 63 65 20 74 61 62 6c 65 73 2c 20 74 68 65 72  rce tables, ther
1ab50 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1ab60 20 6d 61 6b 69 6e 67 0a 20 20 2a 2a 20 61 6e 79   making.  ** any
1ab70 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 2d   further calls -
1ab80 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
1ab90 65 78 28 29 20 6d 65 74 68 6f 64 20 69 73 20 73  ex() method is s
1aba0 61 6e 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  ane they will al
1abb0 6c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  l.  ** return th
1abc0 65 20 73 61 6d 65 20 70 6c 61 6e 20 61 6e 79 77  e same plan anyw
1abd0 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d  ay..  */.  if( m
1abe0 42 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Best ){.    int 
1abf0 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1ac00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ac10 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1ac20 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1ac30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1ac40 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1ac50 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1ac60 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1ac70 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1ac80 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1ac90 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1aca0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1acb0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1acc0 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1acd0 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1ace0 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1acf0 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1ad00 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1ad10 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1ad20 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1ad30 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1ad40 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  d. */.    if( rc
1ad50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1ad60 49 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  In ){.      rc =
1ad70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1ad80 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1ad90 2c 20 6d 45 78 74 72 61 2c 20 28 42 69 74 6d 61  , mExtra, (Bitma
1ada0 73 6b 29 2d 31 2c 20 57 4f 5f 49 4e 2c 20 70 2c  sk)-1, WO_IN, p,
1adb0 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 6d 42 65  &bIn);.      mBe
1adc0 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70  stNoIn = pNew->p
1add0 72 65 72 65 71 20 26 20 7e 6d 45 78 74 72 61 3b  rereq & ~mExtra;
1ade0 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1adf0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1ae00 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1ae10 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e  .        if( bIn
1ae20 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f  ==0 ) seenZeroNo
1ae30 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1ae40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1ae50 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1ae60 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1ae70 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1ae80 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
1ae90 78 74 72 61 29 20 0a 20 20 20 20 2a 2a 20 69 6e  xtra) .    ** in
1aea0 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d   the set of term
1aeb0 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
1aec0 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1aed0 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ual table.  */. 
1aee0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1aef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1af00 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69   int i;.      Bi
1af10 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 28 42  tmask mNext = (B
1af20 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 20  itmask)(-1);.   
1af30 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74     assert( mNext
1af40 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >0 );.      for(
1af50 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1af60 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1af70 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20    Bitmask mThis 
1af80 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
1af90 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74  pWC->a[p->aConst
1afa0 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
1afb0 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
1afc0 74 20 26 20 7e 6d 45 78 74 72 61 0a 20 20 20 20  t & ~mExtra.    
1afd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1afe0 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26  f( mThis>mPrev &
1aff0 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20  & mThis<mNext ) 
1b000 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20  mNext = mThis;. 
1b010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72       }.      mPr
1b020 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20  ev = mNext;.    
1b030 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 28 42 69    if( mNext==(Bi
1b040 74 6d 61 73 6b 29 28 2d 31 29 20 29 20 62 72 65  tmask)(-1) ) bre
1b050 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  ak;.      if( mN
1b060 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e  ext==mBest || mN
1b070 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29  ext==mBestNoIn )
1b080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b090 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b0a0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75  ddVirtualOne(pBu
1b0b0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d  ilder, mExtra, m
1b0c0 4e 65 78 74 7c 6d 45 78 74 72 61 2c 20 30 2c 20  Next|mExtra, 0, 
1b0d0 70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  p, &bIn);.      
1b0e0 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  if( pNew->prereq
1b0f0 3d 3d 6d 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ==mExtra ){.    
1b100 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31      seenZero = 1
1b110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49  ;.        if( bI
1b120 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1b130 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oIN = 1;.      }
1b140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1b150 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78  f the calls to x
1b160 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74  BestIndex() in t
1b170 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69  he above loop di
1b180 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61  d not find a pla
1b190 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  n.    ** that re
1b1a0 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65  quires no source
1b1b0 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28   tables at all (
1b1c0 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74  i.e. one guarant
1b1d0 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eed to be.    **
1b1e0 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61   usable), make a
1b1f0 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20   call here with 
1b200 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65  all source table
1b210 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
1b220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b230 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d  _OK && seenZero=
1b240 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1b250 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1b260 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1b270 2c 20 6d 45 78 74 72 61 2c 20 6d 45 78 74 72 61  , mExtra, mExtra
1b280 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20  , 0, p, &bIn);. 
1b290 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20       if( bIn==0 
1b2a0 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  ) seenZeroNoIN =
1b2b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
1b2c0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74  * If the calls t
1b2d0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 68  o xBestIndex() h
1b2e0 61 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65  ave so far faile
1b2f0 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e  d to find a plan
1b300 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71  .    ** that req
1b310 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20  uires no source 
1b320 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e  tables at all an
1b330 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  d does not use a
1b340 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a  n IN(...).    **
1b350 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20   operator, make 
1b360 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20  a final call to 
1b370 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e  obtain one here.
1b380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1b390 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65  =SQLITE_OK && se
1b3a0 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b  enZeroNoIN==0 ){
1b3b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1b3c0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1b3d0 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  ne(pBuilder, mEx
1b3e0 74 72 61 2c 20 6d 45 78 74 72 61 2c 20 57 4f 5f  tra, mExtra, WO_
1b3f0 49 4e 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20  IN, p, &bIn);.  
1b400 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1b410 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1b420 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1b430 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1b440 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b450 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1b460 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1b470 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1b480 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1b490 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1b4a0 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1b4b0 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1b4c0 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1b4d0 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1b4e0 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1b4f0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1b500 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1b510 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1b520 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1b530 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1b540 45 78 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73  Extra, .  Bitmas
1b550 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20  k mUnusable.){. 
1b560 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1b570 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1b580 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
1b590 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
1b5a0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1b5b0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1b5c0 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
1b5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b5e0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
1b5f0 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
1b600 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
1b610 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
1b620 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
1b630 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75  um, sCur;.  stru
1b640 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b650 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
1b660 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1b670 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
1b680 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
1b690 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1b6a0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
1b6b0 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
1b6c0 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
1b6d0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
1b6e0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
1b6f0 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20  w->iTab;.  iCur 
1b700 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1b710 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
1b720 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
1b730 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
1b740 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
1b750 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1b760 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
1b770 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
1b780 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1b790 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
1b7a0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
1b7b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
1b7c0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
1b7d0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
1b7e0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1b7f0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1b800 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
1b810 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
1b820 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
1b830 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1b840 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
1b850 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1b860 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
1b870 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
1b880 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
1b890 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1b8a0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1b8b0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
1b8c0 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
1b8d0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b8e0 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63  00, ("Begin proc
1b8f0 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1b900 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1b910 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
1b920 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
1b930 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
1b940 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
1b950 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
1b960 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b970 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1b980 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1b990 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
1b9a0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
1b9b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b9c0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
1b9d0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
1b9e0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1b9f0 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
1ba00 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
1ba10 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
1ba20 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
1ba30 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
1ba40 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1ba50 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
1ba60 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
1ba70 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
1ba80 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1ba90 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
1baa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1bab0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1bac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bad0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
1bae0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
1baf0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
1bb00 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1bb10 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64  00, ("OR-term %d
1bb20 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75   of %p has %d su
1bb30 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20  bterms:\n", .   
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f  (int)(pOrTerm-pO
1bb60 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20  rWC->a), pTerm, 
1bb70 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
1bb80 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
1bb90 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
1bba0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1bbc0 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e  =0; i<sSubBuild.
1bbd0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
1bbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  {.            wh
1bbf0 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53  ereTermPrint(&sS
1bc00 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69  ubBuild.pWC->a[i
1bc10 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ], i);.         
1bc20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
1bc30 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1bc40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1bc50 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
1bc60 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1bc70 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1bc80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bc90 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
1bca0 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
1bcb0 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1bcc0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
1bcd0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
1bce0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1bcf0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
1bd00 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
1bd10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bd20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1bd30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bd40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1bd50 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69  opAddOr(&sSubBui
1bd60 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  ld, mExtra, mUnu
1bd70 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1bd80 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1bd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bda0 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a  || sCur.n==0 );.
1bdb0 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72          if( sCur
1bdc0 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1bdd0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1bde0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bdf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1be00 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
1be10 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1be20 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20  &sSum, &sCur);. 
1be30 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
1be40 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1be50 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
1be60 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20  eOrSet sPrev;.  
1be70 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1be80 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
1be90 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
1bea0 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1beb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1bec0 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
1bed0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1bee0 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
1bef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bf00 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
1bf10 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
1bf20 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
1bf30 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1bf60 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
1bf70 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61  [i].rRun, sCur.a
1bf80 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20  [j].rRun),.     
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1bfb0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1bfc0 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b  i].nOut, sCur.a[
1bfd0 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  j].nOut));.     
1bfe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1c000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1c010 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
1c020 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1c030 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
1c040 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1c050 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
1c060 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  OR;.      pNew->
1c070 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
1c080 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1c090 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
1c0a0 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
1c0b0 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
1c0c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1c0d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c0e0 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29  & i<sSum.n; i++)
1c0f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  {.        /* TUN
1c100 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73  ING: Currently s
1c110 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73  Sum.a[i].rRun is
1c120 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20   set to the sum 
1c130 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20  of the costs.   
1c140 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73       ** of all s
1c150 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65  ub-scans require
1c160 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e  d by the OR-scan
1c170 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74  . However, due t
1c180 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20  o rounding.     
1c190 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74     ** errors, it
1c1a0 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65   may be that the
1c1b0 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d   cost of the OR-
1c1c0 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f  scan is equal to
1c1d0 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
1c1e0 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73  most expensive s
1c1f0 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65  ub-scan. Add the
1c200 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
1c210 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20  le penalty .    
1c220 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65      ** (equivale
1c230 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e  nt to multiplyin
1c240 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e  g the cost by 1.
1c250 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68  07) to ensure th
1c260 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  at .        ** t
1c270 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  his does not hap
1c280 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  pen. Otherwise, 
1c290 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
1c2a0 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20  s such as the.  
1c2b0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
1c2c0 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69  ng where there i
1c2d0 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79  s an index on "y
1c2e0 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ":.        **.  
1c2f0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45        **     WHE
1c300 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d  RE likelihood(x=
1c310 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a  ?, 0.99) OR y=?.
1c320 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1c330 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65     ** the planne
1c340 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22  r may elect to "
1c350 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66  OR" together a f
1c360 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61  ull-table scan a
1c370 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nd an.        **
1c380 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41   index lookup. A
1c390 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72  nd other similar
1c3a0 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20  ly odd results. 
1c3b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1c3c0 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
1c3d0 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20  i].rRun + 1;.   
1c3e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1c3f0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74  = sSum.a[i].nOut
1c400 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c410 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b  prereq = sSum.a[
1c420 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  i].prereq;.     
1c430 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1c440 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1c450 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
1c460 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1c470 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70  E(0x200, ("End p
1c480 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1c490 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1c4a0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1c4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c4c0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
1c4d0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
1c4e0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
1c4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1c500 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
1c510 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1c520 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
1c530 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
1c540 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
1c550 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
1c560 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
1c570 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
1c580 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
1c590 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
1c5a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1c5b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c5c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c5d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c5e0 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54  item *pEnd = &pT
1c5f0 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f  abList->a[pWInfo
1c600 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c  ->nLevel];.  sql
1c610 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1c620 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
1c630 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c640 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  _OK;.  WhereLoop
1c650 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69   *pNew;.  u8 pri
1c660 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  orJointype = 0;.
1c670 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
1c680 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
1c690 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
1c6a0 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
1c6b0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1c6c0 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
1c6d0 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
1c6e0 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
1c6f0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  m=pTabList->a; p
1c700 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b  Item<pEnd; iTab+
1c710 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c720 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1c730 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  le = 0;.    pNew
1c740 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
1c750 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
1c760 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  f = sqlite3Where
1c770 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1c780 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
1c790 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1c7a0 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e  if( ((pItem->fg.
1c7b0 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f  jointype|priorJo
1c7c0 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45  intype) & (JT_LE
1c7d0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
1c7e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1c7f0 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
1c800 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69  rue when pItem i
1c810 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  s the FROM claus
1c820 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20  e term on the.  
1c830 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e      ** right-han
1c840 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54  d-side of a LEFT
1c850 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20   or CROSS JOIN. 
1c860 20 2a 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61   */.      mExtra
1c870 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
1c880 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79  .    priorJointy
1c890 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a  pe = pItem->fg.j
1c8a0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
1c8b0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1c8c0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1c8d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c8e0 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  item *p;.      f
1c8f0 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20  or(p=&pItem[1]; 
1c900 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
1c910 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61        if( mUnusa
1c920 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f  ble || (p->fg.jo
1c930 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1c940 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a  T|JT_CROSS)) ){.
1c950 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61            mUnusa
1c960 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  ble |= sqlite3Wh
1c970 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1c980 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d  fo->sMaskSet, p-
1c990 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
1c9a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c9b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1c9c0 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
1c9d0 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55  lder, mExtra, mU
1c9e0 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  nusable);.    }e
1c9f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1ca00 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1ca10 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
1ca20 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
1ca30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1ca50 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
1ca60 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20  uilder, mExtra, 
1ca70 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1ca80 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
1ca90 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
1caa0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
1cab0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1cac0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77   break;.  }..  w
1cad0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
1cae0 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
1caf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1cb00 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
1cb10 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
1cb20 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
1cb30 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
1cb40 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
1cb50 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
1cb60 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
1cb70 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
1cb80 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
1cb90 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
1cba0 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
1cbb0 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
1cbc0 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
1cbd0 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30   N:.** .**   N>0
1cbe0 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74  :   N terms of t
1cbf0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cc00 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
1cc10 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20  .**   N==0:  No 
1cc20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1cc30 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1cc40 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
1cc50 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79  N<0:   Unknown y
1cc60 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d  et how many term
1cc70 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69  s of ORDER BY mi
1cc80 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64  ght be satisfied
1cc90 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  .   .**.** Note 
1cca0 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20  that processing 
1ccb0 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42  for WHERE_GROUPB
1ccc0 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54  Y and WHERE_DIST
1ccd0 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73  INCTBY is not as
1cce0 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74  .** strict.  Wit
1ccf0 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  h GROUP BY and D
1cd00 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79  ISTINCT the only
1cd10 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20   requirement is 
1cd20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65  that.** equivale
1cd30 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69  nt rows appear i
1cd40 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63  mmediately adjac
1cd50 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ent to one anoth
1cd60 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a  er.  GROUP BY.**
1cd70 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f   and DISTINCT do
1cd80 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77   not require row
1cd90 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61  s to appear in a
1cda0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72  ny particular or
1cdb0 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61  der as long.** a
1cdc0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  s equivalent row
1cdd0 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f  s are grouped to
1cde0 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f  gether.  Thus fo
1cdf0 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  r GROUP BY and D
1ce00 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70  ISTINCT.** the p
1ce10 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61  OrderBy terms ca
1ce20 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  n be matched in 
1ce30 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68  any order.  With
1ce40 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a   ORDER BY, the .
1ce50 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  ** pOrderBy term
1ce60 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65  s must be matche
1ce70 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74  d in strict left
1ce80 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e  -to-right order.
1ce90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68  .*/.static i8 wh
1cea0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
1ceb0 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
1cec0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
1ced0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1cee0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1cef0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
1cf00 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  /* ORDER BY or G
1cf10 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49  ROUP BY or DISTI
1cf20 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68  NCT clause to ch
1cf30 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  eck */.  WherePa
1cf40 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
1cf50 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
1cf60 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31  to check */.  u1
1cf70 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
1cf80 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e      /* Might con
1cf90 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50  tain WHERE_GROUP
1cfa0 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54  BY or WHERE_DIST
1cfb0 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20  INCTBY */.  u16 
1cfc0 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nLoop,          
1cfd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1cfe0 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d  ntries in pPath-
1cff0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68  >aLoop[] */.  Wh
1d000 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20  ereLoop *pLast, 
1d010 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
1d020 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65  WhereLoop to the
1d030 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61   end of pPath->a
1d040 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d  Loop[] */.  Bitm
1d050 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20  ask *pRevMask   
1d060 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
1d070 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20  f WhereLoops to 
1d080 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  run in reverse o
1d090 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  rder */.){.  u8 
1d0a0 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20  revSet;         
1d0b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1d0c0 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  v is known */.  
1d0d0 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  u8 rev;         
1d0e0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69        /* Composi
1d0f0 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  te sort order */
1d100 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20  .  u8 revIdx;   
1d110 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d120 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  x sort order */.
1d130 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74    u8 isOrderDist
1d140 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70  inct;   /* All p
1d150 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
1d160 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  are order-distin
1d170 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69  ct */.  u8 disti
1d180 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a  nctColumns;   /*
1d190 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f   True if the loo
1d1a0 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54  p has UNIQUE NOT
1d1b0 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
1d1c0 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20  .  u8 isMatch;  
1d1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c           /* iCol
1d1e0 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65  umn matches a te
1d1f0 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
1d200 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
1d210 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  16 nKeyCol;     
1d220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d230 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  f key columns in
1d240 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
1d250 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
1d260 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1d270 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f  er of ordered co
1d280 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
1d290 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64  ex */.  u16 nOrd
1d2a0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
1d2b0 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e   Number terms in
1d2c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1d2d0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1d2e0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1d2f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72  /* Index of Wher
1d300 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62  eLoop in pPath b
1d310 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
1d320 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
1d330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d340 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d350 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1d360 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1d370 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65  number for curre
1d380 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  nt WhereLoop */.
1d390 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
1d3a0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
1d3b0 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
1d3c0 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a  n table iCur */.
1d3d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1d3e0 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65  op = 0; /* Curre
1d3f0 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69  nt WhereLoop bei
1d400 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f  ng processed. */
1d410 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1d420 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
1d430 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
1d440 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d450 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72  .  Expr *pOBExpr
1d460 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ;        /* An e
1d470 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
1d480 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d490 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  se */.  CollSeq 
1d4a0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  *pColl;       /*
1d4b0 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f   COLLATE functio
1d4c0 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20  n from an ORDER 
1d4d0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  BY clause term *
1d4e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
1d4f0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x;        /* The
1d500 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1d510 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a  d with pLoop */.
1d520 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1d530 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1d540 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
1d550 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1d560 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d   Bitmask obSat =
1d570 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f   0;    /* Mask o
1d580 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
1d590 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61   satisfied so fa
1d5a0 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  r */.  Bitmask o
1d5b0 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20  bDone;       /* 
1d5c0 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45  Mask of all ORDE
1d5d0 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
1d5e0 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73  Bitmask orderDis
1d5f0 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d  tinctMask;  /* M
1d600 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d  ask of all well-
1d610 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f  ordered loops */
1d620 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79  .  Bitmask ready
1d630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d640 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20  * Mask of inner 
1d650 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  loops */..  /*. 
1d660 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
1d670 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65  hereLoop is "one
1d680 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65  -row" if it gene
1d690 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68  rates no more th
1d6a0 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20  an one.  ** row 
1d6b0 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68  of output.  A Wh
1d6c0 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72  ereLoop is one-r
1d6d0 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ow if all of the
1d6e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1d6f0 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41  rue:.  **  (a) A
1d700 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
1d710 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52   match with WHER
1d720 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a  E_COLUMN_EQ..  *
1d730 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78  *  (b) The index
1d740 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20   is unique.  ** 
1d750 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  Any WhereLoop wi
1d760 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55  th an WHERE_COLU
1d770 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  MN_EQ constraint
1d780 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73   on the rowid is
1d790 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45   one-row..  ** E
1d7a0 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1d7b0 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65  reLoop will have
1d7c0 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1d7d0 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46  W bit set in wsF
1d7e0 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lags..  **.  ** 
1d7f0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1d800 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64  Loop is "order-d
1d810 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20  istinct" if the 
1d820 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  set of columns f
1d830 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68  rom.  ** that Wh
1d840 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65  ereLoop that are
1d850 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1d860 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66   clause are diff
1d870 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a  erent for every.
1d880 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1d890 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72  WhereLoop.  Ever
1d8a0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
1d8b0 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63  oop is automatic
1d8c0 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d  ally.  ** order-
1d8d0 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68  distinct.   A Wh
1d8e0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73  ereLoop that has
1d8f0 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   no columns in t
1d900 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d910 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f  se.  ** is not o
1d920 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54  rder-distinct. T
1d930 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
1d940 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65  nct is not quite
1d950 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69   the same as bei
1d960 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73  ng.  ** UNIQUE s
1d970 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f  ince a UNIQUE co
1d980 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61  lumn or index ca
1d990 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
1d9a0 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20  rows that .  ** 
1d9b0 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c  are NULL and NUL
1d9c0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75  L values are equ
1d9d0 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20  ivalent for the 
1d9e0 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72  purpose of order
1d9f0 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20  -distinct..  ** 
1da00 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
1da10 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  inct, the column
1da20 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45  s must be UNIQUE
1da30 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20   and NOT NULL.. 
1da40 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77   **.  ** The row
1da50 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69  id for a table i
1da60 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20  s always UNIQUE 
1da70 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20  and NOT NULL so 
1da80 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a  whenever the.  *
1da90 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20  * rowid appears 
1daa0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1dab0 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72  clause, the corr
1dac0 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c  esponding WhereL
1dad0 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f  oop is.  ** auto
1dae0 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d  matically order-
1daf0 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a  distinct..  */..
1db00 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
1db10 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  By!=0 );.  if( n
1db20 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  Loop && Optimiza
1db30 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1db40 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
1db50 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  dxJoin) ) return
1db60 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20   0;..  nOrderBy 
1db70 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
1db80 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
1db90 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29  OrderBy==BMS-1 )
1dba0 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
1dbb0 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20  >BMS-1 ) return 
1dbc0 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70  0;  /* Cannot op
1dbd0 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61  timize overly la
1dbe0 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f  rge ORDER BYs */
1dbf0 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  .  isOrderDistin
1dc00 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65  ct = 1;.  obDone
1dc10 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65   = MASKBIT(nOrde
1dc20 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44  rBy)-1;.  orderD
1dc30 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b  istinctMask = 0;
1dc40 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20  .  ready = 0;.  
1dc50 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
1dc60 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
1dc70 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
1dc80 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
1dc90 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
1dca0 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
1dcb0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
1dcc0 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  lf;.    pLoop = 
1dcd0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50  iLoop<nLoop ? pP
1dce0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
1dcf0 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69  ] : pLast;.    i
1dd00 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1dd10 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1dd20 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
1dd30 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
1dd40 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
1dd50 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
1dd60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dd70 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
1dd80 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1dd90 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
1dda0 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
1ddb0 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
1ddc0 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
1ddd0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
1dde0 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
1ddf0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
1de00 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
1de10 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
1de20 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
1de30 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
1de40 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
1de50 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
1de60 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
1de70 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
1de80 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1de90 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
1dea0 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
1deb0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
1dec0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ded0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
1dee0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1def0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
1df00 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
1df10 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
1df20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
1df30 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1df40 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
1df50 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
1df60 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1df70 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
1df80 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
1df90 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
1dfa0 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
1dfd0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c  WO_ISNULL|WO_IS,
1dfe0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
1dff0 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1e000 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
1e010 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
1e020 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d  (WO_EQ|WO_IS))!=
1e030 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
1e040 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
1e050 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e060 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
1e070 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1e080 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
1e090 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
1e0a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
1e0b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1e0c0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1e0d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1e0e0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
1e0f0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
1e100 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1e110 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1e120 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
1e130 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
1e140 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1e150 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1e160 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1e170 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
1e180 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
1e190 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1e1a0 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
1e1b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  nue;.        tes
1e1c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
1e1d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
1e1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e1f0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e200 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
1e210 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1e220 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
1e230 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
1e240 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e250 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
1e260 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1e270 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b   = 0;.        nK
1e280 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eyCol = 0;.     
1e290 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a     nColumn = 1;.
1e2a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e2b0 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
1e2c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
1e2d0 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
1e2e0 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
1e2f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e300 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e310 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49      nKeyCol = pI
1e320 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  ndex->nKeyCol;. 
1e330 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
1e340 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1e350 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e360 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43  ( nColumn==nKeyC
1e370 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69  ol+1 || !HasRowi
1e380 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
1e390 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
1e3a0 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43  ert( pIndex->aiC
1e3b0 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d  olumn[nColumn-1]
1e3c0 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20  ==XN_ROWID.     
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
1e3f0 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
1e400 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
1e410 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
1e420 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1e430 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
1e440 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
1e450 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
1e460 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
1e470 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
1e480 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
1e490 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
1e4a0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
1e4b0 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
1e4c0 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
1e4d0 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
1e4e0 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
1e4f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1e500 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1e510 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
1e520 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
1e530 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
1e540 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
1e550 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
1e560 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
1e570 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
1e580 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
1e590 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1e5a0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
1e5b0 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
1e5c0 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
1e5d0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
1e5e0 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
1e5f0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
1e600 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
1e610 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e620 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
1e630 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e640 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e650 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
1e660 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1e670 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
1e680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e690 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
1e6a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1e6b0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
1e6c0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
1e6d0 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
1e6e0 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
1e6f0 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
1e700 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
1e710 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1e720 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
1e730 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
1e740 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
1e750 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1e760 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1e770 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
1e780 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1e790 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1e7a0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
1e7b0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
1e7c0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
1e7d0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1e7e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43  se{.          iC
1e7f0 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44  olumn = XN_ROWID
1e800 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
1e810 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
1e820 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
1e830 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
1e840 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
1e850 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
1e860 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
1e870 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
1e880 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
1e890 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d.        */.   
1e8a0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
1e8b0 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
1e8c0 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
1e8d0 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
1e8e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1e8f0 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
1e900 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
1e910 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
1e920 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
1e930 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
1e940 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
1e950 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e960 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
1e970 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
1e980 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1e990 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
1e9a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
1e9b0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61  the index and ma
1e9c0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
1e9d0 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
1e9e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
1e9f0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
1ea00 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
1ea10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
1ea20 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
1ea30 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1ea40 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
1ea50 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
1ea60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1ea70 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
1ea80 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ea90 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
1eaa0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1eab0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
1eac0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1ead0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
1eae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1eaf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1eb00 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
1eb10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
1eb20 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
1eb30 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
1eb40 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
1eb50 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
1eb60 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1eb70 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20  umn>=(-1) ){.   
1eb80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1eb90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
1eba0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ebc0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
1ebd0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
1ebe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1ebf0 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
1ec00 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
1ec10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1ec20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ec30 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ec40 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45  ExprCompare(pOBE
1ec50 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  xpr,pIndex->aCol
1ec60 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  Expr->a[j].pExpr
1ec70 2c 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20  ,iCur) ){.      
1ec80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1ec90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1eca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ecb0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1ecc0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
1ecd0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1ece0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1ecf0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
1ed00 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1ed10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1ed20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1ed30 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1ed40 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
1ed50 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1ed60 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
1ed70 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
1ed80 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
1ed90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1eda0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
1edb0 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
1edc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1edd0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1ede0 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
1edf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
1ee00 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
1ee10 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
1ee20 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
1ee30 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
1ee40 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
1ee50 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
1ee60 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
1ee70 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
1ee80 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
1ee90 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
1eea0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1eec0 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
1eed0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
1eee0 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
1eef0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
1ef00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ef10 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
1ef20 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
1ef30 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
1ef40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
1ef50 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
1ef60 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
1ef70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
1ef80 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
1ef90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1efa0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
1efb0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
1efc0 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
1efd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1efe0 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
1eff0 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
1f000 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
1f010 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
1f020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f030 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1f040 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
1f050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f060 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
1f070 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
1f080 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
1f090 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1f0a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f0b0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
1f0c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1f0d0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1f0e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1f0f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
1f100 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1f110 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
1f120 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
1f130 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
1f140 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
1f150 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
1f160 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1f170 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
1f180 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
1f190 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
1f1a0 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
1f1b0 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
1f1c0 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
1f1d0 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
1f1e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
1f1f0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
1f200 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
1f210 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
1f220 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
1f230 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
1f240 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
1f250 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1f260 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
1f270 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
1f280 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
1f290 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  mTerm;.        i
1f2a0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1f2b0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1f2c0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
1f2d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1f2e0 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72  pr;.        mTer
1f2f0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
1f300 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66  ExprUsage(&pWInf
1f310 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
1f320 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
1f330 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
1f340 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1f350 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1f360 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
1f370 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
1f380 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1f390 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
1f3a0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
1f3b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f3c0 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
1f3d0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
1f3e0 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
1f3f0 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
1f400 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
1f410 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
1f420 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
1f430 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
1f440 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
1f450 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
1f460 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
1f470 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
1f480 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
1f490 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
1f4a0 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
1f4b0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
1f4c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1f4d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1f4e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
1f4f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
1f500 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
1f510 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
1f520 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1f530 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
1f540 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
1f550 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
1f560 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
1f570 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
1f580 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
1f590 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
1f5a0 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
1f5b0 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
1f5c0 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
1f5d0 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
1f5e0 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
1f5f0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1f600 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
1f610 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
1f620 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
1f630 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
1f640 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
1f650 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
1f660 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
1f670 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
1f680 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
1f690 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
1f6a0 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
1f6b0 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
1f6c0 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
1f6d0 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
1f6e0 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
1f6f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1f700 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
1f710 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
1f720 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
1f730 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
1f740 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
1f750 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
1f760 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
1f770 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
1f780 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
1f790 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
1f7a0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
1f7b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
1f7c0 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
1f7d0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1f7e0 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
1f7f0 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
1f800 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f810 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
1f820 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
1f830 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
1f840 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1f850 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
1f860 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
1f870 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
1f880 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
1f890 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
1f8a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f8b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
1f8c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1f8d0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
1f8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
1f8f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1f900 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
1f910 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
1f920 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
1f930 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
1f940 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
1f950 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
1f960 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
1f970 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
1f980 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
1f990 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
1f9a0 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
1f9b0 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
1f9c0 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
1f9d0 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
1f9e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
1f9f0 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
1fa00 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
1fa10 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
1fa20 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
1fa30 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
1fa40 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
1fa50 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
1fa60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1fa70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
1fa80 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
1fa90 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
1faa0 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
1fab0 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
1fac0 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
1fad0 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
1fae0 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
1faf0 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
1fb00 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
1fb10 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
1fb20 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
1fb30 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
1fb40 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
1fb50 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
1fb60 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
1fb70 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
1fb80 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
1fb90 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
1fba0 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
1fbb0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1fbc0 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
1fbd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1fbe0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1fbf0 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
1fc00 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
1fc10 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
1fc20 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
1fc30 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
1fc40 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
1fc50 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
1fc60 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
1fc70 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
1fc80 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
1fc90 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
1fca0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
1fcb0 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
1fcc0 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
1fcd0 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
1fce0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
1fcf0 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
1fd00 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
1fd10 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
1fd20 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
1fd30 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
1fd40 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
1fd50 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1fd60 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
1fd70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1fd80 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
1fd90 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
1fda0 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
1fdb0 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61  st = nRow + rSca
1fdc0 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d  le + 16;..  /* M
1fdd0 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d  ultiple by log(M
1fde0 29 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65  ) where M is the
1fdf0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1fe00 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65  t rows..  ** Use
1fe10 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d   the LIMIT for M
1fe20 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65   if it is smalle
1fe30 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e  r */.  if( (pWIn
1fe40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1fe50 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
1fe60 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e  )!=0 && pWInfo->
1fe70 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20  iLimit<nRow ){. 
1fe80 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f     nRow = pWInfo
1fe90 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  ->iLimit;.  }.  
1fea0 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74  rSortCost += est
1feb0 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74  Log(nRow);.  ret
1fec0 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d  urn rSortCost;.}
1fed0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1fee0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
1fef0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
1ff00 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
1ff10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1ff20 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
1ff30 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
1ff40 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
1ff50 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
1ff60 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
1ff70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
1ff80 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
1ff90 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
1ffa0 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
1ffb0 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
1ffc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
1ffd0 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
1ffe0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
1fff0 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
20000 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
20010 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
20020 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
20030 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
20040 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
20050 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
20060 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
20070 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
20080 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
20090 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
200a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
200b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
200c0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
200d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
200e0 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
200f0 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20110 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
20120 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
20130 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
20140 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
20150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20160 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
20170 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
20180 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
20190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
201a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
201b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
201d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
201e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
201f0 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
20200 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20210 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
20220 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
20230 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
20240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20250 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
20260 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
20270 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20280 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
20290 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
202a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
202b0 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rBy;            
202c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
202d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
202e0 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  rms */.  LogEst 
202f0 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
20300 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
20310 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
20320 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
20330 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b   mxUnsorted = 0;
20340 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75      /* Maximum u
20350 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
20360 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f  a set of path */
20370 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
20380 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
20390 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
203a0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
203b0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
203c0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
203d0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
203e0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
203f0 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
20400 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
20410 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
20420 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
20430 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
20440 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
20450 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
20460 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
20470 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
20480 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
20490 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
204a0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
204b0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
204c0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
204d0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
204e0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
204f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
20500 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
20510 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
20520 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
20530 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
20540 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
20550 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
20560 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
20570 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74  .  LogEst *aSort
20580 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cost = 0;    /* 
20590 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74  Sorting and part
205a0 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74  ial sorting cost
205b0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  s */.  char *pSp
205c0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
205d0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
205e0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
205f0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  s routine */.  i
20600 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20  nt nSpace;      
20610 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
20620 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
20630 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a  ated at pSpace *
20640 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
20650 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
20660 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20670 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  .  nLoop = pWInf
20680 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20  o->nLevel;.  /* 
20690 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70  TUNING: For simp
206a0 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79  le queries, only
206b0 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69   the best path i
206c0 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20  s tracked..  ** 
206d0 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c  For 2-way joins,
206e0 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68   the 5 best path
206f0 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a  s are followed..
20700 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f    ** For joins o
20710 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  f 3 or more tabl
20720 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30  es, track the 10
20730 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20   best paths */. 
20740 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f   mxChoice = (nLo
20750 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c  op<=1) ? 1 : (nL
20760 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29  oop==2 ? 5 : 10)
20770 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
20780 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
20790 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57  ist->nSrc );.  W
207a0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
207b0 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f   ("---- begin so
207c0 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d  lver.  (nRowEst=
207d0 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  %d)\n", nRowEst)
207e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77  );..  /* If nRow
207f0 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  Est is zero and 
20800 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
20810 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e  R BY clause, ign
20820 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a  ore it. In this.
20830 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75    ** case the pu
20840 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
20850 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74  ll is to estimat
20860 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
20870 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20  rows returned.  
20880 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c  ** by the overal
20890 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68  l query. Once th
208a0 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20  is estimate has 
208b0 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
208c0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77  he caller.  ** w
208d0 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
208e0 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e  function a secon
208f0 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20  d time, passing 
20900 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20  the estimate as 
20910 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74  the.  ** nRowEst
20920 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a   parameter.  */.
20930 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
20940 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
20950 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  wEst==0 ){.    n
20960 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
20970 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
20980 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
20990 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
209a0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
209b0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
209c0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61  space for aTo, a
209d0 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f  From and aSortCo
209e0 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65  st[] */.  nSpace
209f0 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
20a00 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
20a10 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
20a20 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53  mxChoice*2;.  nS
20a30 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  pace += sizeof(L
20a40 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
20a50 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  y;.  pSpace = sq
20a60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
20a70 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  NN(db, nSpace);.
20a80 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
20a90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20aa0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54  NOMEM_BKPT;.  aT
20ab0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
20ac0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
20ad0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
20ae0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
20af0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
20b00 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
20b10 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
20b20 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
20b30 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
20b40 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
20b50 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
20b60 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
20b70 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
20b80 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
20b90 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
20ba0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
20bb0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20bc0 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
20bd0 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
20be0 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
20bf0 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
20c00 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
20c10 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
20c20 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
20c30 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
20c40 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
20c50 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
20c60 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
20c70 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
20c80 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
20c90 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
20ca0 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
20cb0 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
20cc0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
20cd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
20ce0 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
20cf0 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
20d00 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
20d10 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
20d20 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
20d30 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
20d40 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
20d50 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
20d60 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
20d70 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
20d80 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
20d90 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
20da0 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
20db0 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
20dc0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
20dd0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
20de0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
20df0 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
20e00 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
20e10 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
20e20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
20e30 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
20e40 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
20e50 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
20e60 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
20e70 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20  ns go above 28. 
20e80 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
20e90 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
20ea0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
20eb0 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
20ec0 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
20ed0 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73  rst 28.  ** rows
20ee0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
20ef0 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
20f00 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
20f10 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
20f20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
20f30 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74  op, 48);  assert
20f40 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 48==sqlite3Log
20f50 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72  Est(28) );.  nFr
20f60 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
20f70 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
20f80 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
20f90 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
20fa0 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
20fb0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
20fc0 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
20fd0 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
20fe0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
20ff0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
21000 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
21010 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
21020 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
21030 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
21040 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
21050 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
21060 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
21070 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
21080 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
21090 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
210a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
210b0 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
210c0 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
210d0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
210e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
210f0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
21100 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
21110 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
21120 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
21130 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
21140 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
21150 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
21160 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
21170 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
21180 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
21190 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
211a0 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
211b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
211c0 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
211d0 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
211e0 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
211f0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
21200 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
21210 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
21220 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
21230 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
21240 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
21250 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
21260 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
21270 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
21280 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
21290 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
212a0 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
212b0 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
212c0 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
212d0 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
212e0 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
212f0 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21310 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
21320 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
21330 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
21340 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21360 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
21370 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
21380 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
21390 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
213a0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
213b0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
213c0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
213d0 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
213e0 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
213f0 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
21400 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
21410 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
21420 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
21430 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
21440 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
21450 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
21460 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
21470 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
21480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21490 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
214a0 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
214b0 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
214c0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
214d0 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
214e0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
214f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21500 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
21510 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
21520 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
21530 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21540 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73   if( (pWLoop->ws
21550 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
21560 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
21570 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29  pFrom->nRow<10 )
21580 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
21590 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74  o not use an aut
215a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20  omatic index if 
215b0 74 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  the this loop is
215c0 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20   expected.      
215d0 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65      ** to run le
215e0 73 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e  ss than 2 times.
215f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
21600 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
21610 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
21620 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
21630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21640 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
21650 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
21660 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
21670 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
21680 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
21690 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
216a0 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
216b0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
216c0 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
216d0 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
216e0 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
216f0 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
21700 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
21710 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
21720 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
21730 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
21740 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
21750 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
21760 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
21770 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
21780 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
21790 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
217a0 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
217b0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
217c0 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
217d0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
217e0 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
21810 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
21820 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
21850 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
21860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21870 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
21880 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
21890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
218a0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
218b0 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
218c0 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
218d0 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
218e0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
218f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21900 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
21910 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
21920 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
21930 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
21940 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
21950 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
21960 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
21970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21980 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
21990 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
219a0 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
219b0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
219c0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
219d0 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
219e0 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
219f0 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
21a00 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
21a10 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
21a20 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
21a30 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
21a40 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
21a50 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
21a60 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
21a80 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
21a90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21aa0 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
21ab0 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
21ac0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21ad0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
21ae0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
21af0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
21b00 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
21b10 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
21b20 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
21b30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
21b40 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
21b50 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
21b60 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
21b70 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
21b80 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
21b90 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
21ba0 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
21bb0 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
21bc0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
21bd0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
21be0 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
21bf0 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
21c00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
21c10 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
21c20 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
21c30 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
21c40 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
21c50 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
21c60 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
21c70 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
21c80 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
21c90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
21ca0 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
21cb0 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
21cc0 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
21cd0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
21ce0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
21cf0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
21d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
21d10 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
21d20 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
21d30 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
21d40 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
21d50 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
21d60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
21d70 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
21d80 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
21d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21db0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
21dc0 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
21dd0 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
21de0 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
21df0 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
21e00 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
21e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21e20 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
21e30 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
21e40 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
21e50 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
21e60 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
21e70 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
21e80 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
21e90 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
21ea0 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
21eb0 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
21ec0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
21ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21ee0 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
21ef0 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
21f00 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
21f10 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
21f20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
21f30 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
21f40 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
21f50 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
21f60 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
21f70 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21f80 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
21f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21fa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21fb0 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
21fc0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
21fd0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21ff0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
22000 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
22010 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
22040 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
22050 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
22060 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22070 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
22080 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22090 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
220a0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
220b0 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
220c0 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
220d0 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
220e0 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
220f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
22100 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
22110 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
22120 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
22130 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
22140 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
22150 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
22160 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
22170 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
22180 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
22190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
221a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
221b0 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
221c0 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
221d0 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
221e0 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
221f0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
22200 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22210 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
22220 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
22230 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
22240 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
22250 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22260 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
22270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
22280 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22290 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
222a0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
222b0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
222c0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
222d0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
222e0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
222f0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
22300 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22310 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
22320 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
22330 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
22340 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
22350 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
22360 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
22370 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61  re if best-so-fa
22380 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a  r path pTo=aTo[j
22390 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20  j] covers the.  
223a0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
223b0 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
223c0 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f   has the sam isO
223d0 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
223e0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
223f0 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
22400 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
22410 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
22420 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
22430 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
22440 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
22450 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
22460 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
22470 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
22480 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54  ost<rCost || (pT
22490 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
224a0 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
224b0 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ut) ){.#ifdef WH
224c0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
224d0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
224e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
224f0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
22500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22510 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22520 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
22530 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
22540 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
22550 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22570 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
22580 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
22590 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
225c0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
225d0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
225e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
225f0 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
22600 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
22610 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22630 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
22640 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
22650 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
22660 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
22670 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
22680 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
22690 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
226a0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
226b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
226c0 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
226d0 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
226e0 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
226f0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
22700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
22710 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
22720 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
22730 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
22740 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
22750 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22760 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
22770 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
22780 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
22790 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
227a0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
227b0 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
227c0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
227d0 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
227e0 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
227f0 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
22800 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22810 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
22820 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
22830 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
22840 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
22850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22860 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
22870 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
22880 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
22890 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
228c0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
228d0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
228e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
228f0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
22900 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
22910 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
22920 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22930 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
22940 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
22950 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
22960 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
22970 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
22980 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
22990 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
229a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
229b0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
229c0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
229d0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
229e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
229f0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
22a00 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
22a10 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
22a20 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
22a30 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
22a40 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
22a50 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
22a60 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
22a70 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
22a80 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
22a90 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
22aa0 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
22ab0 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
22ac0 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
22ad0 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
22ae0 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
22af0 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
22b00 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
22b10 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
22b20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
22b30 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
22b40 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
22b50 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
22b60 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
22b70 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
22b80 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
22b90 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
22ba0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
22bb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
22bc0 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
22bd0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
22be0 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
22bf0 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
22c00 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
22c10 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
22c20 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
22c30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22c40 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
22c50 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
22c60 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
22c70 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
22c80 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
22c90 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
22ca0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22cb0 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
22cc0 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
22cd0 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
22ce0 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
22cf0 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
22d00 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
22d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22d40 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
22d50 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
22d60 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
22d70 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
22d80 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20  e & 0x02 ){.    
22d90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22da0 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
22db0 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
22dc0 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
22dd0 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
22de0 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
22df0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
22e00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22e10 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
22e20 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
22e30 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
22e40 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
22e50 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
22e60 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
22e70 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
22e80 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
22e90 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
22ea0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
22eb0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
22ec0 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
22ed0 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
22ee0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22ef0 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
22f00 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
22f10 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
22f20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
22f30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22f40 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
22f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
22f60 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
22f70 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
22f80 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
22f90 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
22fa0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
22fb0 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
22fc0 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
22fd0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
22fe0 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
22ff0 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
23000 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
23010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23020 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
23030 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
23040 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
23050 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
23060 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23070 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
23080 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
23090 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
230a0 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
230b0 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
230c0 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
230d0 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
230e0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
230f0 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
23100 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
23110 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
23120 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
23130 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
23140 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
23150 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
23160 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
23170 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
23180 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
23190 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
231a0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
231b0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
231c0 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
231d0 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
231e0 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
231f0 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
23200 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
23210 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
23220 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
23230 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
23240 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
23250 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
23260 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
23270 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
23280 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23290 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
232a0 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
232b0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
232c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
232d0 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
232e0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
232f0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
23300 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
23310 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
23320 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
23330 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
23340 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
23350 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
23360 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
23370 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
23380 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
23390 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
233a0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
233b0 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
233c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
233d0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
233e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
233f0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
23400 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
23410 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
23420 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
23430 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
23440 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23450 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23460 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
23470 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
23480 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
23490 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
234a0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
234b0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
234c0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
234d0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
234e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
234f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
23500 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
23510 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66  rdered;.      if
23520 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
23530 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  <0 ) pWInfo->nOB
23540 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Sat = 0;.      p
23550 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
23560 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
23570 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
23580 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
23590 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
235a0 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
235b0 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
235c0 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
235d0 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c  rBy->nExpr && nL
235e0 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20  oop>0.    ){.   
235f0 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
23600 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
23610 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65  t nOrder = where
23620 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
23630 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
23640 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a  nfo->pOrderBy, .
23650 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c            pFrom,
23660 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72   0, nLoop-1, pFr
23670 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
23680 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20  1], &revMask.   
23690 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
236a0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  rt( pWInfo->sort
236b0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ed==0 );.      i
236c0 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66  f( nOrder==pWInf
236d0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
236e0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  pr ){.        pW
236f0 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31  Info->sorted = 1
23700 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
23710 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d  ->revMask = revM
23720 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
23730 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66   }.  }...  pWInf
23740 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
23750 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
23760 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
23770 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
23780 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
23790 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
237a0 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
237b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
237c0 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
237d0 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
237e0 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
237f0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
23800 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
23810 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
23820 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
23830 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
23840 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
23850 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
23860 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
23870 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
23880 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
23890 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
238a0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
238b0 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
238c0 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
238d0 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
238e0 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
238f0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
23900 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
23910 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
23920 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
23930 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
23940 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
23950 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
23960 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
23970 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
23980 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
23990 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
239a0 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
239b0 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
239c0 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
239d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
239e0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
239f0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
23a00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
23a10 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
23a20 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
23a30 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
23a40 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
23a50 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
23a60 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
23a70 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
23a80 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20  ;.  .  pWInfo = 
23a90 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
23aa0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
23ab0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23ac0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29  RE_FORCE_TABLE )
23ad0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
23ae0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
23af0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
23b00 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
23b10 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
23b20 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
23b30 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
23b40 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
23b50 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23b60 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
23b70 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  edBy ) return 0;
23b80 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
23b90 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
23ba0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
23bb0 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
23bc0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
23bd0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
23be0 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d    pLoop->nSkip =
23bf0 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71   0;.  pTerm = sq
23c00 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
23c10 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
23c20 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  , 0, WO_EQ|WO_IS
23c30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
23c40 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  m ){.    testcas
23c50 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
23c60 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
23c70 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
23c80 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
23c90 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
23ca0 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
23cb0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
23cc0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
23cd0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
23ce0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
23cf0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
23d00 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
23d10 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
23d20 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
23d30 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
23d40 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
23d50 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
23d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
23d70 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23d80 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
23d90 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
23da0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20    int opMask;.  
23db0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
23dc0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
23dd0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
23de0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e  .      if( !IsUn
23df0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a  iqueIndex(pIdx).
23e00 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
23e10 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
23e20 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
23e30 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
23e40 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
23e50 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
23e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23e70 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e   opMask = pIdx->
23e80 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57  uniqNotNull ? (W
23e90 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f  O_EQ|WO_IS) : WO
23ea0 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  _EQ;.      for(j
23eb0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
23ec0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
23ed0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
23ee0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
23ef0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c  pWC, iCur, j, 0,
23f00 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a   opMask, pIdx);.
23f10 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
23f20 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
23f30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23f40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23f50 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
23f60 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
23f70 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
23f80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23f90 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
23fa0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23fb0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
23fc0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
23fd0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
23fe0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
23ff0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
24000 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
24010 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
24020 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
24030 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
24040 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
24050 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
24060 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
24070 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
24080 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
24090 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
240a0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
240b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
240c0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
240d0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
240e0 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
240f0 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
24100 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
24110 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
24120 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
24130 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
24140 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
24150 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
24160 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
24170 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
24180 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
24190 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
241a0 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
241b0 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
241c0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
241d0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
241e0 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
241f0 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
24200 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
24210 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
24220 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
24230 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
24240 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
24250 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
24260 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
24270 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
24280 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
24290 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
242a0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
242b0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
242c0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
242d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
242e0 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
242f0 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
24300 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
24310 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
24320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24330 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
24340 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
24350 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
24360 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
24370 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
24380 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
24390 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
243a0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
243b0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
243c0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
243d0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
243e0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
243f0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
24400 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
24410 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
24420 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
24430 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
24440 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
24450 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
24460 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24470 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
24480 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
24490 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
244a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
244b0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
244c0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
244d0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
244e0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
244f0 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
24500 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
24510 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
24520 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
24530 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
24540 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
24550 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
24560 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
24570 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24580 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
24590 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
245a0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
245b0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
245c0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
245d0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
245e0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
245f0 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
24600 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
24610 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
24620 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
24630 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
24640 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
24650 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
24660 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
24670 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
24680 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
24690 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
246a0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
246b0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
246c0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
246d0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
24700 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
24710 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
24720 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
24730 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
24740 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
24770 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
24780 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
24790 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
247a0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
247b0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
247c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
247d0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
247e0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
247f0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
24800 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
24810 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
24820 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
24830 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
24840 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
24850 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
24860 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
24870 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
24880 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
24890 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
248a0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
248b0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
248c0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
248d0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
248e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
248f0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
24900 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
24910 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
24920 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
24930 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
24940 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
24950 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
24960 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
24970 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
24980 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
24990 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
249a0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
249b0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
249c0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
249d0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
249e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
249f0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
24a00 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
24a10 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
24a20 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
24a30 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
24a40 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
24a50 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
24a60 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
24a70 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
24a80 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
24a90 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
24aa0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
24ab0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
24ac0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
24ad0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
24ae0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
24af0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
24b00 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
24b10 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
24b20 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
24b30 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
24b40 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
24b50 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
24b60 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
24b70 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
24b80 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
24b90 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
24ba0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
24bb0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
24bc0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
24bd0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
24be0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
24bf0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
24c00 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
24c10 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
24c20 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
24c30 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
24c40 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
24c50 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
24c60 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
24c70 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
24c80 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
24c90 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
24ca0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
24cb0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
24cc0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
24cd0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
24ce0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
24cf0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
24d00 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
24d10 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
24d20 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
24d30 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
24d40 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
24d50 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
24d60 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
24d70 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
24d80 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
24d90 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
24da0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
24db0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
24dc0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
24dd0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
24de0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
24df0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
24e00 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
24e10 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
24e20 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
24e30 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
24e40 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
24e50 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
24e60 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
24e70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
24e80 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
24e90 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
24ea0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
24eb0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
24ec0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
24ed0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
24ee0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
24ef0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
24f00 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
24f10 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
24f20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
24f30 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
24f40 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
24f50 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
24f60 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
24f70 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
24f80 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
24f90 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
24fa0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
24fb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
24fc0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
24fd0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
24fe0 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
24ff0 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
25000 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
25010 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
25020 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
25030 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
25040 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
25050 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
25060 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25070 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
25080 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
25090 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
250a0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
250b0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
250c0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
250d0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
250e0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
250f0 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
25100 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
25110 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
25120 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
25130 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
25140 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
25150 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
25160 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
25170 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
25180 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
25190 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
251a0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
251b0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
251c0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
251d0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
251e0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
251f0 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
25200 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
25210 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
25220 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
25230 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
25240 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
25250 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
25260 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
25270 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
25280 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
25290 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
252a0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
252b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
252c0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
252d0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
252e0 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
252f0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
25300 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
25310 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
25320 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
25330 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
25340 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
25350 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
25360 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
25370 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
25380 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
25390 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
253a0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
253b0 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
253c0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
253d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
253e0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
253f0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
25400 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41  h */.  int iAuxA
25410 72 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rg           /* 
25420 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
25430 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
25440 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
25450 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
25460 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
25470 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  f WHERE_USE_LIMI
25480 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d 69  T, then the limi
25490 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20  t amount */.){. 
254a0 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
254b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
254c0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
254d0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
254e0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
254f0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
25500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25510 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
25520 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
25530 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
25540 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
25550 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
25560 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
25570 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
25580 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25590 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
255a0 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
255b0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
255c0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
255d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
255e0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
255f0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
25600 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
25610 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
25620 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
25630 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
25640 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
25650 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
25660 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
25670 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
25680 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
25690 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
256a0 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
256b0 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
256c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
256d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
256e0 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
256f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
25700 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25720 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
25730 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25750 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
25760 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
25770 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25780 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25790 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f  code */.  u8 bFo
257a0 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  rdelete = 0;    
257b0 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46       /* OPFLAG_F
257c0 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f  ORDELETE or zero
257d0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
257e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
257f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
25800 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
25810 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20  ROW)==0 || (.   
25820 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73       (wctrlFlags
25830 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
25840 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20  _DESIRED)!=0 .  
25850 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
25860 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
25870 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 0a 20  PEN_CLOSE)==0 . 
25880 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20   ));..  /* Only 
25890 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f 4e 45  one of WHERE_ONE
258a0 54 41 42 4c 45 5f 4f 4e 4c 59 20 6f 72 20 57 48  TABLE_ONLY or WH
258b0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f  ERE_USE_LIMIT */
258c0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
258d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
258e0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
258f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
25900 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
25910 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
25920 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
25930 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
25940 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
25950 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
25960 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
25970 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
25980 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
25990 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
259a0 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
259b0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
259c0 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
259d0 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
259e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
259f0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
25a00 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
25a10 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
25a20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
25a30 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
25a40 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
25a50 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
25a60 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
25a70 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
25a80 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
25a90 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
25aa0 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
25ab0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
25ac0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
25ad0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
25ae0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
25af0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
25b00 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
25b10 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
25b20 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
25b30 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
25b40 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
25b50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25b60 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
25b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
25b80 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
25b90 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
25ba0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
25bb0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
25bc0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
25bd0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
25be0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25bf0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
25c00 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
25c10 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
25c20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
25c30 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
25c40 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
25c50 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
25c60 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
25c70 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
25c80 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
25c90 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
25ca0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
25cb0 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
25cc0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
25cd0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
25ce0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
25cf0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
25d00 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
25d10 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
25d20 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
25d30 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
25d40 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
25d50 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
25d60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
25d70 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
25d80 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
25d90 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
25da0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
25db0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
25dc0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
25dd0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
25de0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
25df0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
25e00 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
25e10 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
25e20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
25e30 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
25e40 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
25e50 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
25e60 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
25e70 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
25e80 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
25e90 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
25ea0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
25eb0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
25ec0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
25ed0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
25ee0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
25ef0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
25f00 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
25f10 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
25f20 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
25f30 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
25f40 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
25f50 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
25f60 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
25f70 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
25f80 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
25f90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
25fa0 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
25fb0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
25fc0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
25fd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
25fe0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25ff0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
26000 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
26010 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
26020 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
26030 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
26040 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
26050 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
26060 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
26070 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
26080 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
26090 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
260a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
260b0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
260c0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
260d0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
260e0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
260f0 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  t = pResultSet;.
26100 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
26110 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
26120 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
26130 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
26140 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
26150 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
26160 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  s;.  pWInfo->iLi
26170 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  mit = iAuxArg;. 
26180 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
26190 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
261a0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
261b0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
261c0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
261d0 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e  SS_OFF );  /* ON
261e0 45 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74  EPASS defaults t
261f0 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b  o OFF */.  pMask
26200 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
26210 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
26220 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
26230 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
26240 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
26250 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
26260 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70  Loop*)(((char*)p
26270 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66  WInfo)+nByteWInf
26280 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  o);.  assert( EI
26290 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
262a0 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b  NT(sWLB.pNew) );
262b0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
262c0 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
262d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
262e0 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
262f0 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
26300 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
26310 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
26320 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
26330 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
26340 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
26350 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
26360 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
26370 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
26380 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
26390 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  kSet);.  sqlite3
263a0 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  WhereClauseInit(
263b0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
263c0 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Info);.  sqlite3
263d0 57 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  WhereSplit(&pWIn
263e0 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
263f0 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
26400 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
26410 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
26420 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
26430 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
26440 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
26450 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
26460 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
26470 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
26480 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ru..  */.  for(i
26490 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43  i=0; ii<sWLB.pWC
264a0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
264b0 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74      if( nTabList
264c0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
264d0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
264e0 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b  oin(sWLB.pWC->a[
264f0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
26500 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26510 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73  fFalse(pParse, s
26520 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70  WLB.pWC->a[ii].p
26530 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  Expr, pWInfo->iB
26540 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  reak,.          
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26560 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26570 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57  );.      sWLB.pW
26580 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73  C->a[ii].wtFlags
26590 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
265a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
265b0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
265c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
265d0 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
265e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
265f0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
26600 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65  ->nOBSat = pOrde
26610 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
26620 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
26630 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
26640 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
26650 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
26660 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
26670 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
26680 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
26690 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
266a0 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
266b0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
266c0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
266d0 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d  ** The N-th term
266e0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
266f0 75 73 65 20 69 73 20 61 73 73 69 67 6e 65 64 20  use is assigned 
26700 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c  a bitmask of 1<<
26710 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  N..  **.  ** The
26720 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65   rule of the pre
26730 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65  vious sentence e
26740 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58  nsures thta if X
26750 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
26760 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  for.  ** a table
26770 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20   T, then X-1 is 
26780 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
26790 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73  all other tables
267a0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
267b0 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20  T..  ** Knowing 
267c0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
267d0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
267e0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
267f0 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d   join is.  ** im
26800 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
26810 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
26820 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
26830 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
26840 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
26850 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
26860 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
26870 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
26880 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
26890 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
268a0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
268b0 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
268c0 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
268d0 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
268e0 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
268f0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
26900 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
26910 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
26920 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
26930 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
26940 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
26950 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
26960 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
26970 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
26980 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73  abFuncArgs(pPars
26990 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e, &pTabList->a[
269a0 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ii], &pWInfo->sW
269b0 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  C);.  }.#ifdef S
269c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
269d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
269e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
269f0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20  {.    Bitmask m 
26a00 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
26a10 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
26a20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
26a30 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73  iCursor);.    as
26a40 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54  sert( m==MASKBIT
26a50 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  (ii) );.  }.#end
26a60 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
26a70 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
26a80 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
26a90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
26aa0 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
26ab0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
26ac0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
26ad0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
26ae0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
26af0 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
26b00 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
26b10 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
26b20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
26b30 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
26b40 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
26b50 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
26b60 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
26b70 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
26b80 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
26b90 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
26ba0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
26bb0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
26bc0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
26bd0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
26be0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
26bf0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
26c00 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
26c10 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
26c20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
26c30 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
26c40 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
26c50 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
26c60 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
26c70 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
26c80 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
26c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26ca0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
26cb0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
26cc0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
26cd0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26ce0 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
26cf0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26d00 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
26d10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26d20 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
26d30 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
26d40 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
26d50 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
26d60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26d70 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
26d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26d90 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
26da0 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
26db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26dc0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26dd0 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
26de0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26df0 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
26e00 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
26e10 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
26e20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e  clause */.    in
26e30 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
26e40 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  ; i<sWLB.pWC->nT
26e50 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
26e60 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
26e70 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c  &sWLB.pWC->a[i],
26e80 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   i);.    }.  }.#
26e90 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61  endif..  if( nTa
26ea0 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
26eb0 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
26ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
26ed0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
26ee0 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
26ef0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
26f00 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69  eginError;.  .#i
26f10 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26f20 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
26f30 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
26f40 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c  e ){    /* Displ
26f50 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
26f60 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
26f70 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  */.      WhereLo
26f80 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74  op *p;.      int
26f90 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63   i;.      static
26fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62   const char zLab
26fb0 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
26fc0 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
26fd0 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44             "ABCD
27010 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
27020 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66  UVWYXZ";.      f
27030 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  or(p=pWInfo->pLo
27040 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70  ops, i=0; p; p=p
27050 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b  ->pNextLoop, i++
27060 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49  ){.        p->cI
27070 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a  d = zLabel[i%siz
27080 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20  eof(zLabel)];.  
27090 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
270a0 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43  rint(p, sWLB.pWC
270b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
270c0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77  .#endif.  .    w
270d0 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
270e0 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69  WInfo, 0);.    i
270f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27100 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27110 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
27120 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
27130 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77  erBy ){.       w
27140 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
27150 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e  WInfo, pWInfo->n
27160 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20  RowOut+1);.     
27170 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27180 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
27190 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
271a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
271b0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
271c0 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  =0 && (db->flags
271d0 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
271e0 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20  eOrder)!=0 ){.  
271f0 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
27200 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d  sk = (Bitmask)(-
27210 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  1);.  }.  if( pP
27220 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
27230 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
27240 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
27250 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
27260 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
27270 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
27280 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
27290 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
272a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
272b0 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
272c0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
272d0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
272e0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
272f0 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
27300 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27310 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
27320 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
27330 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
27340 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
27350 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
27360 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
27370 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
27380 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
27390 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
273a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
273b0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
273c0 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
273d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
273e0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
273f0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
27400 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
27410 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
27420 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
27430 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
27440 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27450 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
27460 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
27470 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
27480 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
27490 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
274a0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
274b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
274c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
274d0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
274e0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
274f0 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
27500 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
27510 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
27520 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
27530 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
27540 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
27550 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
27560 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
27570 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
27580 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
27590 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
275a0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
275b0 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
275c0 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
275d0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
275e0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
275f0 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
27600 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
27610 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65  sed = sqlite3Whe
27620 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
27630 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
27640 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
27650 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  WLB.pOrderBy ){.
27660 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d        tabUsed |=
27670 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
27680 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
27690 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
276a0 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  By);.    }.    w
276b0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
276c0 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
276d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
276e0 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
276f0 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
27700 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
27710 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
27720 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
27730 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
27740 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74  ->iTab].fg.joint
27750 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
27760 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
27770 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
27780 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
27790 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20  STINCT)==0.     
277a0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
277b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
277c0 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ROW)==0.      ){
277d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
277e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
277f0 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f  ( (tabUsed & pLo
27800 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
27810 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27820 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d  pEnd = sWLB.pWC-
27830 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e  >a + sWLB.pWC->n
27840 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
27850 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
27860 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
27870 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
27880 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
27890 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
278a0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20  maskSelf)!=0.   
278b0 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
278c0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
278d0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
278e0 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  oin).        ){.
278f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27910 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
27920 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b  rm<pEnd ) break;
27930 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
27940 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64  E(0xffff, ("-> d
27950 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20  rop loop %c not 
27960 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e  used\n", pLoop->
27970 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49  cId));.      pWI
27980 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
27990 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
279a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
279b0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
279c0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
279d0 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
279e0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
279f0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
27a00 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
27a10 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
27a20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
27a30 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
27a40 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
27a50 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
27a60 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
27a70 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
27a80 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
27a90 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
27aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
27ab0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27ac0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
27ad0 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
27ae0 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
27af0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
27b00 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
27b10 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20  DESIRED)!=0 ){. 
27b20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d     int wsFlags =
27b30 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
27b40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
27b50 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d     int bOnerow =
27b60 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
27b70 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20  E_ONEROW)!=0;.  
27b80 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20    if( bOnerow.  
27b90 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61     || ((wctrlFla
27ba0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27bb0 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a  SS_MULTIROW)!=0.
27bc0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
27bd0 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  =(wsFlags & WHER
27be0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
27bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 57  .    ){.      pW
27c00 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d  Info->eOnePass =
27c10 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41   bOnerow ? ONEPA
27c20 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50  SS_SINGLE : ONEP
27c30 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20  ASS_MULTI;.     
27c40 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
27c50 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
27c60 62 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26  b) && (wsFlags &
27c70 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
27c80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
27c90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27ca0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
27cb0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
27cc0 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50   bFordelete = OP
27cd0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a  FLAG_FORDELETE;.
27ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27cf0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
27d00 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  WLoop->wsFlags =
27d10 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45   (wsFlags & ~WHE
27d20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20  RE_IDX_ONLY);.  
27d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27d40 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
27d50 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
27d60 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
27d70 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
27d80 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
27d90 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
27da0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c    */.  for(ii=0,
27db0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
27dc0 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
27dd0 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
27de0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27df0 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
27e00 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
27e10 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
27e20 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
27e30 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
27e40 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
27e50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27e60 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
27e70 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
27e80 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
27e90 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
27ea0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
27eb0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
27ec0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
27ed0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
27ee0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
27ef0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
27f00 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
27f10 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
27f20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
27f30 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
27f40 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
27f50 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
27f60 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
27f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
27f80 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
27f90 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
27fa0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
27fb0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
27fc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
27fd0 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
27fe0 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
27ff0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
28000 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
28010 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
28020 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
28030 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
28040 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
28050 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
28060 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
28070 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
28080 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
28090 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
280a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
280b0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
280c0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
280d0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
280e0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
280f0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
28100 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
28110 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
28120 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
28130 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
28140 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
28150 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  F ){.        op 
28160 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
28170 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
28180 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
28190 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
281a0 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
281b0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
281c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
281d0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
281e0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
281f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
28200 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
28210 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
28220 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28230 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
28240 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
28250 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
28260 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
28270 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
28280 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
28290 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
282a0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
282b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
282c0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
282d0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
282e0 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
282f0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
28300 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
28310 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
28320 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
28330 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
28340 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
28350 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
28360 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
28370 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45  P4(v, -1, SQLITE
28380 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
28390 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
283a0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
283b0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
283c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
283d0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
283e0 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  HINTS.      if( 
283f0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
28400 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
28410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
28420 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
28430 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c  G_SEEKEQ|bFordel
28440 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ete);.      }els
28450 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
28460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28470 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
28480 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
28490 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
284a0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
284b0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
284c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
284d0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
284e0 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
284f0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
28500 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28520 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
28530 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
28540 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
28550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28560 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
28570 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
28580 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
28590 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
285a0 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
285b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
285c0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
285d0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
285e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
285f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
28600 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
28610 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
28620 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
28630 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79  iAuxArg is alway
28640 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
28650 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
28660 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
28670 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
28680 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
28690 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
286a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
286b0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
286c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
286d0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
286e0 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
286f0 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
28700 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
28710 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
28720 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20 20  _ONLY)!=0.      
28730 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
28740 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
28750 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
28760 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
28770 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
28780 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
28790 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
287a0 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
287b0 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
287c0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
287d0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
287e0 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
287f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28800 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  e if( pWInfo->eO
28810 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
28820 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49  OFF ){.        I
28830 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49  ndex *pJ = pTabI
28840 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  tem->pTab->pInde
28850 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  x;.        iInde
28860 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
28870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28880 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28890 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
288a0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ED );.        wh
288b0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20  ile( ALWAYS(pJ) 
288c0 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20  && pJ!=pIx ){.  
288d0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
288e0 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
288f0 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20  J = pJ->pNext;. 
28900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28910 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
28920 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
28930 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
28940 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  [1] = iIndexCur;
28950 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28960 20 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74   iAuxArg && (wct
28970 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28980 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
28990 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  0 ){.        iIn
289a0 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
289b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63  ;.        if( wc
289c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
289d0 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20 6f 70  _REOPEN_IDX ) op
289e0 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b   = OP_ReopenIdx;
289f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28a00 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
28a10 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
28a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a30 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
28a40 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
28a50 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
28a60 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
28a70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
28a80 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
28a90 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r>=0 );.      if
28aa0 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
28ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28ac0 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
28ad0 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
28ae0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
28af0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
28b00 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
28b10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
28b20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28b30 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
28b40 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  T)!=0.         &
28b50 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
28b60 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
28b70 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b  N_RANGE|WHERE_SK
28b80 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20  IPSCAN))==0.    
28b90 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
28ba0 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
28bb0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
28bc0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
28bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28be0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
28bf0 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
28c00 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
28c10 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
28c20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
28c30 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
28c40 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
28c50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
28c60 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
28c70 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
28c80 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
28c90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
28ca0 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
28cb0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
28cc0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
28cd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
28ce0 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
28cf0 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
28d00 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
28d10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28d20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
28d30 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
28d40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
28d50 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
28d60 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
28d70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28d80 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
28d90 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
28da0 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
28db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28dd0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
28de0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
28df0 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
28e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
28e30 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
28e40 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
28e50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
28e60 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
28e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28e80 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
28e90 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
28ea0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
28eb0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
28ec0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
28ed0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
28ee0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
28ef0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
28f00 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
28f10 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
28f20 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
28f30 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
28f40 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
28f50 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
28f60 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
28f70 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
28f80 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
28f90 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
28fa0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
28fb0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
28fc0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
28fd0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
28fe0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
28ff0 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
29000 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
29010 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
29020 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
29030 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
29040 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
29050 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
29060 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
29070 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
29080 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
29090 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
290a0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
290b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
290c0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
290d0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
290e0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
290f0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
29100 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
29110 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
29120 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
29130 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29140 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
29150 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
29160 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
29170 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
29180 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
29190 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
291a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
291b0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
291c0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
291d0 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
291e0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
291f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
29200 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
29210 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
29220 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
29230 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
29240 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
29250 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
29260 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
29270 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
29280 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
29290 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
292a0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
292b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
292c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
292d0 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61  lite3WhereAddSca
292e0 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c  nStatus(v, pTabL
292f0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64  ist, pLevel, add
29300 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d  rExplain);.    }
29310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
29320 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
29330 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
29340 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  in WHERE-core"))
29350 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
29360 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
29370 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
29380 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
29390 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
293a0 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
293b0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
293c0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
293d0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
293e0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
293f0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
29400 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29410 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
29420 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
29430 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
29440 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
29450 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
29460 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
29470 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
29480 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
29490 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
294a0 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
294b0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
294c0 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
294d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
294e0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
294f0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
29500 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
29510 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
29520 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
29530 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
29540 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
29550 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
29560 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
29570 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
29580 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c    */.  VdbeModul
29590 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
295a0 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  d WHERE-core"));
295b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
295c0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
295d0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
295e0 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
295f0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
29600 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  addr;.    pLevel
29610 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
29620 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
29630 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
29640 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29650 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
29660 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
29670 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
29680 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
29690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
296a0 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c  AddOp3(v, pLevel
296b0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
296c0 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c  , pLevel->p2, pL
296d0 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20  evel->p3);.     
296e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
296f0 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
29700 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p5);.      VdbeC
29710 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29720 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
29730 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
29740 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  OP_Next);.      
29750 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
29760 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
29770 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64  _Prev);.      Vd
29780 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29790 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56  pLevel->op==OP_V
297a0 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Next);.    }.   
297b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
297c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
297d0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
297e0 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
297f0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
29800 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
29810 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
29820 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
29830 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
29840 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
29850 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
29860 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
29870 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
29880 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
29890 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
298a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
298b0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
298c0 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
298d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
298e0 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
298f0 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
29900 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
29910 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
29920 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29930 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29940 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  If(v, pIn->eEndL
29950 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66  oopOp==OP_PrevIf
29960 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 56  Open);.        V
29970 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
29980 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
29990 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29  ==OP_NextIfOpen)
299a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
299b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
299c0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
299d0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
299e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
299f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
29a00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
29a10 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
29a20 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20  l->addrSkip ){. 
29a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29a40 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
29a50 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
29a60 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29a70 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e   "next skip-scan
29a80 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e   on %s", pLoop->
29a90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
29aa0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
29ab0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
29ac0 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
29ad0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73  drSkip);.      s
29ae0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
29af0 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
29b00 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d  drSkip-2);.    }
29b10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29b20 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
29b30 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20  H_BLOBS.    if( 
29b40 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
29b50 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Rep ){.      int
29b60 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73   op;.      if( s
29b70 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
29b80 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  v, pLevel->addrL
29b90 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b  ikeRep-1)->p1 ){
29ba0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
29bb0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20  _DecrJumpZero;. 
29bc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29bd0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70      op = OP_Jump
29be0 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20  ZeroIncr;.      
29bf0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
29c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
29c10 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
29c20 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61  pCntr, pLevel->a
29c30 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20  ddrLikeRep);.   
29c40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
29c50 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  v);.    }.#endif
29c60 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
29c70 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
29c80 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
29c90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
29ca0 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
29cb0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64  ->iLeftJoin); Vd
29cc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
29cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
29ce0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
29cf0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
29d00 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
29d10 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
29d20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
29d30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
29d40 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
29d50 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
29d60 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
29d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29d80 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
29d90 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
29da0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
29db0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
29dc0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
29dd0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
29de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29df0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
29e00 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
29e10 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
29e20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
29e30 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
29e40 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
29e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
29e60 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
29e70 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
29e80 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
29e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29ea0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
29eb0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
29ec0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
29ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29ee0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
29ef0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
29f00 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
29f10 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c  (v, "End WHERE-l
29f20 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20  oop%d: %s", i,. 
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62      pWInfo->pTab
29f50 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
29f60 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61  iFrom].pTab->zNa
29f70 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  me));.  }..  /* 
29f80 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
29f90 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
29fa0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
29fb0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
29fc0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
29fd0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
29fe0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
29ff0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
2a000 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2a010 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c  o->nLevel<=pTabL
2a020 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
2a030 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
2a040 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
2a050 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
2a060 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2a070 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
2a080 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
2a090 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2a0a0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
2a0b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2a0c0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2a0d0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2a0e0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
2a0f0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2a100 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2a110 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2a120 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
2a130 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a  >pWLoop;..    /*
2a140 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e   For a co-routin
2a150 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50  e, change all OP
2a160 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63  _Column referenc
2a170 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  es to the table 
2a180 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
2a190 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50  -routine into OP
2a1a0 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20  _Copy of result 
2a1b0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72  contained in a r
2a1c0 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20  egister..    ** 
2a1d0 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73  OP_Rowid becomes
2a1e0 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f   OP_Null..    */
2a1f0 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
2a200 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2a210 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ne && !db->mallo
2a220 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
2a230 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e   translateColumn
2a240 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c  ToCopy(v, pLevel
2a250 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
2a260 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
2a290 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
2a2a0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2a2b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2a2c0 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
2a2d0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
2a2e0 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
2a2f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
2a300 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
2a310 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73  o not close curs
2a320 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ors that will be
2a330 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20 4f   reused by the O
2a340 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  R optimization. 
2a350 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49     ** (WHERE_OMI
2a360 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20  T_OPEN_CLOSE).  
2a370 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  And do not close
2a380 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74   the OP_OpenWrit
2a390 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a  e cursors.    **
2a3a0 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65   created for the
2a3b0 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a   ONEPASS optimiz
2a3c0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2a3d0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2a3e0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2a3f0 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
2a400 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
2a410 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
2a420 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2a430 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
2a440 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
2a450 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
2a460 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
2a470 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2a480 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2a490 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26  ASS_OFF && (ws &
2a4a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2a4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2a4c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2a4d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
2a4e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
2a4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a500 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
2a510 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
2a520 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45     && (ws & (WHE
2a530 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54  RE_IPK|WHERE_AUT
2a540 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20  O_INDEX))==0 .  
2a550 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e       && pLevel->
2a560 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d  iIdxCur!=pWInfo-
2a570 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
2a580 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2a590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a5a0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
2a5b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2a5c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a5d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2a5e0 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
2a5f0 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
2a600 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
2a610 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
2a620 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
2a630 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
2a640 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
2a650 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
2a660 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
2a670 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
2a680 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
2a690 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
2a6a0 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
2a6b0 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
2a6c0 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
2a6d0 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
2a6e0 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
2a6f0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
2a700 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2a710 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
2a720 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
2a730 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
2a740 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
2a750 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
2a760 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2a770 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
2a780 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
2a790 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
2a7a0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
2a7b0 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
2a7c0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
2a7d0 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
2a7e0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
2a7f0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
2a800 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
2a810 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
2a820 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2a830 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a840 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2a850 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2a860 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2a870 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2a880 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
2a890 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2a8a0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
2a8b0 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
2a8c0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
2a8d0 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
2a8e0 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26   if( pIdx.     &
2a8f0 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
2a900 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2a910 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
2a920 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20  dx->pTable)).   
2a930 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63    && !db->malloc
2a940 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20  Failed.    ){.  
2a950 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2a960 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2a970 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
2a980 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2a990 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
2a9a0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2a9b0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
2a9c0 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
2a9d0 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
2a9e0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
2a9f0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
2aa00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2aa10 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2aa20 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
2aa30 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
2aa40 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
2aa50 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
2aa60 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
2aa70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2aa80 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2aa90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
2aaa0 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
2aab0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2aac0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2aad0 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
2aae0 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
2aaf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
2ab00 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
2ab10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
2ab20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2ab30 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
2ab40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
2ab50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ab60 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
2ab70 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2ab80 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2ab90 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2aba0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
2abb0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2abc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2abd0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
2abe0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
2abf0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
2ac00 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
2ac10 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
2ac20 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
2ac30 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
2ac40 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
2ac50 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
2ac60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ac70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
2ac80 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
2ac90 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2aca0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2acb0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2acc0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
2acd0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
2ace0 75 72 6e 3b 0a 7d 0a                             urn;.}.