/ Hex Artifact Content
Login

Artifact 64689b9787b7013d26e04f34be091f5af5970ca8:


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 20 20 69 66 28 20 69 43  Expr;.    if( iC
2690: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
26a0: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
26b0: 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
26c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 20  .  }.  if( pIdx 
26d0: 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  && iColumn>=0 ){
26e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
26f0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
2700: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2710: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 70  .affinity;.    p
2720: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
2730: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
2740: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
2750: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
2760: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
2770: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
2780: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
2790: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
27a0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
27b0: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69  an->aiCur[0] = i
27c0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69  Cur;.  pScan->ai
27d0: 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c  Column[0] = iCol
27e0: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
27f0: 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61  quiv = 1;.  pSca
2800: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->iEquiv = 1;. 
2810: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
2820: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
2830: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2840: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
2850: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2860: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2870: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2880: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2890: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28a0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
28b0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
28c0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
28d0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
28e0: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
28f0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
2900: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
2910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2920: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2930: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2940: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
2950: 74 68 65 6e 20 73 65 61 72 63 68 20 66 6f 72 20  then search for 
2960: 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74  terms matching t
2970: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
2980: 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20  lumn of pIdx.** 
2990: 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
29a0: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
29b0: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  n of table iCur.
29c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
29d0: 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62  returned might b
29e0: 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68  y Y=<expr> if th
29f0: 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63  ere is another c
2a00: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20  onstraint in.** 
2a10: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a20: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
2a30: 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73  that X=Y.  Any s
2a40: 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  uch constraints 
2a50: 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74  will be.** ident
2a60: 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f  ified by the WO_
2a70: 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68 65  EQUIV bit in the
2a80: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
2a90: 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a  r field.  The.**
2aa0: 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d   aiCur[]/iaColum
2ab0: 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20  n[] arrays hold 
2ac0: 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71  X and all its eq
2ad0: 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65  uivalents. There
2ae0: 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73   are 11.** slots
2af0: 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f   in aiCur[]/aiCo
2b00: 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d  lumn[] so that m
2b10: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
2b20: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
2b30: 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71  o 10.** other eq
2b40: 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e  uivalent values.
2b50: 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68    Hence a search
2b60: 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75   for X will retu
2b70: 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41  rn <expr> if X=A
2b80: 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61  1.** and A1=A2 a
2b90: 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e  nd A2=A3 and ...
2ba0: 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20   and A9=A10 and 
2bb0: 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a  A10=<expr>..**.*
2bc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d  * If there are m
2bd0: 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
2be0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2bf0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  e of the form "X
2c00: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
2c10: 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68   then try for th
2c20: 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65  e one with no de
2c30: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65  pendencies on <e
2c40: 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20  xpr> - in other 
2c50: 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c  words where.** <
2c60: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74  expr> is a const
2c70: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ant expression o
2c80: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e  f some kind.  On
2c90: 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65  ly return entrie
2ca0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2cb0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
2cc0: 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e Y is a column 
2cd0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  in another table
2ce0: 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a   if no terms of.
2cf0: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
2d00: 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e  op> <const-expr>
2d10: 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f  " exist.   If no
2d20: 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f   terms with a co
2d30: 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78  nstant RHS.** ex
2d40: 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75  ist, try to retu
2d50: 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64  rn a term that d
2d60: 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45  oes not use WO_E
2d70: 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  QUIV..*/.WhereTe
2d80: 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  rm *sqlite3Where
2d90: 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  FindTerm(.  Wher
2da0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2db0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2dc0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
2dd0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
2de0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2df0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2e00: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
2e10: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
2e20: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2e30: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2e40: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2e50: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
2e60: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
2e70: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
2e80: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
2e90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2ea0: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
2eb0: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
2ec0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
2ed0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
2ee0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
2ef0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
2f00: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
2f10: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
2f20: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
2f30: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2f40: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
2f50: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
2f60: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
2f70: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
2f80: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
2f90: 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f   op &= WO_EQ|WO_
2fa0: 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  IS;.  while( p )
2fb0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
2fc0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
2fd0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2fe0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
2ff0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
3000: 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20  Operator&op)!=0 
3010: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
3020: 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f  ase( p->eOperato
3030: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
3040: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
3050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3060: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
3070: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
3080: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
3090: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
30a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
30b0: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
30c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
30d0: 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61  ches pList for a
30e0: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  n entry that mat
30f0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
3100: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
3110: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
3120: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
3130: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
3140: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
3150: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
3160: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
3170: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
3180: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
3190: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
31a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
31b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
31e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
31f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
3200: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3210: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
3220: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
3230: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
3250: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
3260: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
3270: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
3280: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
3290: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
32a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
32b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
32e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
32f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
3300: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
3310: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
3320: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
3330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
3340: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3350: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3360: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3370: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
3380: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
3390: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
33a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
33b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
33c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
33d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
33e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
33f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
3400: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3410: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3420: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3430: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
3440: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
3450: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3460: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
3470: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
3480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3490: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
34a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
34b0: 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d  RUE if the iCol-
34c0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
34d0: 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e  ex pIdx is NOT N
34e0: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
34f0: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  t indexColumnNot
3500: 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78  Null(Index *pIdx
3510: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
3520: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
3530: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73  pIdx!=0 );.  ass
3540: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20  ert( iCol>=0 && 
3550: 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  iCol<pIdx->nColu
3560: 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78  mn );.  j = pIdx
3570: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
3580: 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  ;.  if( j>=0 ){.
3590: 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d      return pIdx-
35a0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
35b0: 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73  .notNull;.  }els
35c0: 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b  e if( j==(-1) ){
35d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
35e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35f0: 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20  rt( j==(-2) );. 
3600: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
3610: 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65 78   Assume an index
3620: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  ed expression ca
3630: 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20 61  n always yield a
3640: 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a   NULL */..  }.}.
3650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
3660: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
3670: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
3680: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
3690: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
36a0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
36b0: 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43  .**.** A DISTINC
36c0: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
36d0: 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73 65  ant if any subse
36e0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  t of the columns
36f0: 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54 49   in the.** DISTI
3700: 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f 6c  NCT list are col
3710: 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65  lectively unique
3720: 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 6c   and individuall
3730: 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  y non-null..*/.s
3740: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
3750: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
3760: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3780: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3790: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
37a0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
37b0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
37c0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
37d0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
37e0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
37f0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
3800: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
3810: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
3820: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
3830: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
3840: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
3850: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
3860: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
3890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
38a0: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
38b0: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
38c0: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
38d0: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
38e0: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
38f0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
3900: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
3910: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
3920: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
3930: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
3940: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
3950: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
3960: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
3970: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
3980: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
3990: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
39a0: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
39b0: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
39c0: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
39d0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
39e0: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
39f0: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
3a00: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
3a10: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
3a20: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
3a30: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
3a40: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
3a50: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
3a60: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
3a70: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
3a80: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
3a90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
3aa0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
3ab0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
3ac0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
3ad0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
3ae0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
3af0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3b00: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
3b10: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
3b20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
3b30: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
3b40: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
3b50: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
3b60: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
3b70: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
3b80: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
3b90: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
3ba0: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
3bb0: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
3bc0: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
3bd0: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
3be0: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
3bf0: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
3c00: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
3c10: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
3c20: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
3c30: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
3c40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3c50: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
3c60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
3c70: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
3c80: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
3c90: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
3ca0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
3cb0: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
3cc0: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
3cd0: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
3ce0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
3cf0: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
3d00: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
3d10: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
3d20: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
3d30: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
3d40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d50: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
3d60: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
3d70: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
3d80: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
3d90: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
3da0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
3db0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
3dc0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
3dd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3de0: 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
3df0: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
3e00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3e10: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
3e20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  ++){.      if( 0
3e30: 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  ==sqlite3WhereFi
3e40: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
3e50: 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29  e, i, ~(Bitmask)
3e60: 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
3e70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
3e80: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
3e90: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
3ea0: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30  Base, pIdx, i)<0
3eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3ec0: 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d    if( indexColum
3ed0: 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69  nNotNull(pIdx, i
3ee0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
3ef0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3f00: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( i==pIdx->nKe
3f10: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  yCol ){.      /*
3f20: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
3f30: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
3f40: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3f50: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
3f60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3f80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
3f90: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
3fa0: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
3fb0: 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62  input value to b
3fc0: 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  ase 2..*/.static
3fd0: 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c   LogEst estLog(L
3fe0: 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75  ogEst N){.  retu
3ff0: 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73  rn N<=10 ? 0 : s
4000: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20  qlite3LogEst(N) 
4010: 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  - 33;.}../*.** C
4020: 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e  onvert OP_Column
4030: 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43   opcodes to OP_C
4040: 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c  opy in previousl
4050: 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  y generated code
4060: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4070: 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67  tine runs over g
4080: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
4090: 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65  de and translate
40a0: 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f  s OP_Column.** o
40b0: 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43  pcodes into OP_C
40c0: 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61 62  opy when the tab
40d0: 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63 65  le is being acce
40e0: 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74  ssed via co-rout
40f0: 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ine .** instead 
4100: 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f  of via table loo
4110: 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  kup..**.** If th
4120: 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61 72  e bIncrRowid par
4130: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
4140: 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69  n any OP_Rowid i
4150: 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a  nstructions on.*
4160: 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75 72  * cursor iTabCur
4170: 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64   are transformed
4180: 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20 4f   into OP_Null. O
4190: 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69 64  r, if bIncrRowid
41a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a   is non-zero,.**
41b0: 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52 6f   then each OP_Ro
41c0: 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  wid is transform
41d0: 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72  ed into an instr
41e0: 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65 6d  uction to increm
41f0: 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ent the.** value
4200: 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20 6f   stored in its o
4210: 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e 0a  utput register..
4220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
4230: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
4240: 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76 2c  Copy(.  Vdbe *v,
4250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4260: 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e 69  he VDBE containi
4270: 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e 73  ng code to trans
4280: 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  late */.  int iS
4290: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  tart,         /*
42a0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
42b0: 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74  this opcode to t
42c0: 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  he end */.  int 
42d0: 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20  iTabCur,        
42e0: 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f  /* OP_Column/OP_
42f0: 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73  Rowid references
4300: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
4310: 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65  /.  int iRegiste
4320: 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  r,      /* The f
4330: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69  irst column is i
4340: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
4350: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f  */.  int bIncrRo
4360: 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  wid      /* If n
4370: 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f  on-zero, transfo
4380: 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f  rm OP_rowid to O
4390: 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29  P_AddImm(1) */.)
43a0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  {.  VdbeOp *pOp 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
43c0: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
43d0: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
43e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
43f0: 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69  dr(v);.  for(; i
4400: 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61  Start<iEnd; iSta
4410: 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20  rt++, pOp++){.  
4420: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69    if( pOp->p1!=i
4430: 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
4440: 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e;.    if( pOp->
4450: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
4460: 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  n ){.      pOp->
4470: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79  opcode = OP_Copy
4480: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20  ;.      pOp->p1 
4490: 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67  = pOp->p2 + iReg
44a0: 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70  ister;.      pOp
44b0: 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  ->p2 = pOp->p3;.
44c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20        pOp->p3 = 
44d0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
44e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
44f0: 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
4500: 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20 29  if( bIncrRowid )
4510: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63  {.        /* Inc
4520: 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
4530: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
4540: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  2 operand of the
4550: 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20 20   OP_Rowid. */.  
4560: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4570: 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a 20  e = OP_AddImm;. 
4580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
4590: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
45a0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a 20    pOp->p2 = 1;. 
45b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
45c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
45d0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
45e0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
45f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
4600: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4610: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4620: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
4630: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
4640: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
4650: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
4660: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
4670: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
4680: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4690: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
46a0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
46b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
46c0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
46d0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
46e0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
46f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4700: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4710: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
4720: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
4730: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
4740: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
4750: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
4760: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
4770: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
4780: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
4790: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
47a0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
47b0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
47c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
47d0: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
47e0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
47f0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
4800: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
4810: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4820: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
4830: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
4840: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
4850: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
4860: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4870: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
4880: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4890: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
48a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
48b0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
48c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
48d0: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
48e0: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
48f0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
4900: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
4910: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
4920: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
4930: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
4940: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
4950: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
4960: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
4970: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
4980: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
4990: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
49a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
49b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
49c0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
49d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
49e0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
49f0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
4a00: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
4a10: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4a20: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
4a30: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
4a40: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
4a50: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
4a60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
4a70: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
4a80: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
4a90: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
4aa0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
4ab0: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
4ac0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
4ad0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
4ae0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
4af0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
4b00: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
4b10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4b20: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
4b30: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
4b40: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
4b50: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4b60: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
4b70: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
4b80: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
4b90: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
4ba0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
4bb0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
4bc0: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
4bd0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
4be0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
4bf0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
4c00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4c10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4c20: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
4c30: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
4c40: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
4c50: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
4c60: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
4c70: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
4c80: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
4c90: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
4ca0: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
4cb0: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
4cc0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4ce0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4cf0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
4d00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
4d10: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
4d20: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
4d30: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
4d40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4d50: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
4d60: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
4d70: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
4d80: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
4d90: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
4da0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4db0: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
4dc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4dd0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
4de0: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
4df0: 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _IS))==0 ) retur
4e00: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
4e10: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
4e20: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
4e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4e40: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
4e50: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
4e60: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
4e70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
4e80: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
4e90: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
4ea0: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
4eb0: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
4ec0: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
4ed0: 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73  urn 0;.  testcas
4ee0: 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
4ef0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
4f00: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4f10: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
4f20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
4f30: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
4f40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
4f50: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
4f60: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
4f70: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
4f80: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
4f90: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
4fa0: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
4fb0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
4fc0: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
4fd0: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
4fe0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
4ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5000: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
5010: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
5020: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5040: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5050: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
5060: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
5070: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5080: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
5090: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
50a0: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
50b0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
50c0: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
50d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
50e0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
50f0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
5100: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
5110: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
5120: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
5130: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
5140: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
5150: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5160: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5180: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
5190: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
51a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
51b0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
51d0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
51e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
51f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
5200: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
5210: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
5220: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5230: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
5240: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
5250: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
5260: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
5270: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5290: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
52a0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
52b0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
52c0: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
52d0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
52e0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
52f0: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
5300: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
5310: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
5320: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5330: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5340: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
5370: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
5380: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
5390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
53a0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
53b0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
53c0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
53f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5410: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5420: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5430: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
5440: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
5450: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
5460: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
5470: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5490: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
54a0: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
54b0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
54c0: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
54d0: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
54e0: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
54f0: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
5500: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
5510: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
5520: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
5530: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
5540: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
5550: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
5560: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
5570: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
5580: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
5590: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
55a0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
55b0: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
55c0: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
55d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
55e0: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
55f0: 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70   issued */.  Exp
5600: 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b  r *pPartial = 0;
5610: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74           /* Part
5620: 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73  ial Index Expres
5630: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sion */.  int iC
5640: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20  ontinue = 0;    
5650: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5660: 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75  re to skip exclu
5670: 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74  ded rows */.  st
5680: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5690: 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
56a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
56b0: 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  m being indexed 
56c0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 75  */.  int addrCou
56d0: 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nter = 0;       
56e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65 72   /* Address wher
56f0: 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 65  e integer counte
5700: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5710: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
5720: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5730: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
5740: 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72 65  gisters where re
5750: 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c 65  cord is assemble
5760: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
5770: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
5780: 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
5790: 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
57a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
57b0: 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
57c0: 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
57d0: 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
57e0: 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
57f0: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
5800: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5810: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
5820: 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
5830: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
5840: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5850: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
5860: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
5870: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
5880: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
5890: 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
58a0: 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
58b0: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
58c0: 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20  ts */.  nKeyCol 
58d0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
58e0: 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
58f0: 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
5900: 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
5910: 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
5920: 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
5930: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
5940: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
5950: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
5960: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
5970: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
5980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
5990: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
59a0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
59b0: 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20 61  )    /* prereq a
59c0: 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a  lways non-zero *
59d0: 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  /.         || pE
59e0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
59f0: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
5a00: 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20 74  sor   /*   for t
5a10: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20 20  he right-hand   
5a20: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5a30: 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30 20  Loop->prereq!=0 
5a40: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
5a50: 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62 6c         /*   tabl
5a60: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
5a70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
5a80: 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20 20  p->prereq==0.   
5a90: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46    && (pTerm->wtF
5aa0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
5ab0: 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  UAL)==0.     && 
5ac0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5ad0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
5ae0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71 6c  oin).     && sql
5af0: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
5b00: 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20 70  onstant(pExpr, p
5b10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b  Src->iCursor) ){
5b20: 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20  .      pPartial 
5b30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
5b40: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
5b50: 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  rtial,.         
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5b80: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
5b90: 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20  , pExpr, 0));.  
5ba0: 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d    }.    if( term
5bb0: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
5bc0: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
5bd0: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
5be0: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
5bf0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
5c00: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
5c10: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
5c20: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
5c30: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
5c40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5c50: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
5c60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5c70: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
5c80: 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69    if( !sentWarni
5c90: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
5ca0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5cb0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
5cc0: 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EX,.            
5cd0: 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78  "automatic index
5ce0: 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61   on %s(%s)", pTa
5cf0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
5d00: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
5d10: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
5d20: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57  );.        sentW
5d30: 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  arning = 1;.    
5d40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
5d50: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
5d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
5d70: 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
5d80: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
5d90: 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20  oop, nKeyCol+1) 
5da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
5db0: 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  o end_auto_index
5dc0: 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20  _create;.       
5dd0: 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70   }.        pLoop
5de0: 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c  ->aLTerm[nKeyCol
5df0: 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
5e00: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5e10: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  cMask;.      }. 
5e20: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
5e30: 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a  t( nKeyCol>0 );.
5e40: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
5e50: 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  .nEq = pLoop->nL
5e60: 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a  Term = nKeyCol;.
5e70: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
5e80: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
5e90: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
5ea0: 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
5eb0: 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  XED.            
5ec0: 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
5ed0: 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20  _AUTO_INDEX;..  
5ee0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5ef0: 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  ber of additiona
5f00: 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
5f10: 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a   to create a.  *
5f20: 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  * covering index
5f30: 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69  .  A "covering i
5f40: 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65  ndex" is an inde
5f50: 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
5f60: 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  all.  ** columns
5f70: 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64   that are needed
5f80: 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20   by the query.  
5f90: 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20  With a covering 
5fa0: 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20  index, the.  ** 
5fb0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e  original table n
5fc0: 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
5fd0: 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f   accessed.  Auto
5fe0: 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75  matic indices mu
5ff0: 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76  st.  ** be a cov
6000: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61  ering index beca
6010: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  use the index wi
6020: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
6030: 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72  d if the.  ** or
6040: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61  iginal table cha
6050: 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64  nges and the ind
6060: 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e  ex and table can
6070: 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64  not both be used
6080: 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f  .  ** if they go
6090: 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20   out of sync..  
60a0: 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d  */.  extraCols =
60b0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
60c0: 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53   (~idxCols | MAS
60d0: 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20  KBIT(BMS-1));.  
60e0: 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42  mxBitCol = MIN(B
60f0: 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f  MS-1,pTable->nCo
6100: 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  l);.  testcase( 
6110: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
6120: 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  S-1 );.  testcas
6130: 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
6140: 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28  =BMS-2 );.  for(
6150: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
6160: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
6170: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
6180: 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b  IT(i) ) nKeyCol+
6190: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
61a0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
61b0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
61c0: 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54     nKeyCol += pT
61d0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53  able->nCol - BMS
61e0: 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   + 1;.  }..  /* 
61f0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
6200: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
6210: 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
6220: 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  x */.  pIdx = sq
6230: 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
6240: 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d  exObject(pParse-
6250: 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20  >db, nKeyCol+1, 
6260: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  0, &zNotUsed);. 
6270: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67   if( pIdx==0 ) g
6280: 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  oto end_auto_ind
6290: 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f  ex_create;.  pLo
62a0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
62b0: 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
62c0: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
62d0: 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
62e0: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
62f0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
6300: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
6310: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
6320: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
6330: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
6340: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
6350: 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
6360: 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
6370: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
6380: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
6390: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
63a0: 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
63b0: 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
63c0: 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
63d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
63e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
63f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6400: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
6410: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
6420: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
6430: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
6440: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
6450: 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
6460: 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
6470: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
6480: 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
6490: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
64a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
64b0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
64c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
64d0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
64e0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
64f0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6500: 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d  = pColl ? pColl-
6510: 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33  >zName : sqlite3
6520: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
6530: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
6540: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6550: 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
6560: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
6570: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
6580: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
6590: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
65a0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
65b0: 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
65c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
65d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
65e0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
65f0: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6600: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
6610: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6620: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
6630: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
6640: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
6650: 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  NARY;.      n++;
6660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6670: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
6680: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
6690: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
66a0: 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
66b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
66c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
66d0: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
66e0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73  x->azColl[n] = s
66f0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6700: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
6710: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6720: 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
6730: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
6740: 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
6750: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6760: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
6770: 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  RY;..  /* Create
6780: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
6790: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
67a0: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
67b0: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
67c0: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
67d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
67e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
67f0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
6800: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
6810: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
6820: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
6830: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
6840: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
6860: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
6870: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
6880: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
6890: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
68a0: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
68b0: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
68c0: 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65  arse);.  pTabIte
68d0: 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f  m = &pWC->pWInfo
68e0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
68f0: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
6900: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6910: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6920: 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
6930: 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65  d = pTabItem->re
6940: 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64  gReturn;.    add
6950: 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  rCounter = sqlit
6960: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6970: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
6980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6990: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
69a0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
69b0: 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
69c0: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
69d0: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
69e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
69f0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6a00: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
6a10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6a20: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
6a30: 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
6a40: 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49  f \"%s\"", pTabI
6a50: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
6a60: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
6a70: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
6a80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6a90: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
6aa0: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
6ab0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6ac0: 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  }.  if( pPartial
6ad0: 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75   ){.    iContinu
6ae0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
6af0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
6b00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
6b10: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  lse(pParse, pPar
6b20: 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  tial, iContinue,
6b30: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
6b40: 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  LL);.    pLoop->
6b50: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
6b60: 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d  _PARTIALIDX;.  }
6b70: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
6b80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6b90: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42  (pParse);.  regB
6ba0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e  ase = sqlite3Gen
6bb0: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20  erateIndexKey(. 
6bc0: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64       pParse, pId
6bd0: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
6be0: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  ur, regRecord, 0
6bf0: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  , 0, 0, 0.  );. 
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6c20: 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
6c30: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
6c40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6c50: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6c60: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6c70: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
6c80: 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
6c90: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
6ca0: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
6cb0: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
6cc0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6cd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6ce0: 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74  eP2(v, addrCount
6cf0: 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a  er, regBase+n);.
6d00: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
6d10: 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64  umnToCopy(v, add
6d20: 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  rTop, pLevel->iT
6d30: 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d  abCur, pTabItem-
6d40: 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a  >regResult, 1);.
6d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
6d60: 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
6d70: 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66  .    pTabItem->f
6d80: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
6d90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6db0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
6dc0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
6dd0: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
6de0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
6df0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6e00: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
6e10: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
6e20: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
6e30: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6e40: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
6e50: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6e60: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
6e70: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6e80: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
6e90: 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  rse);.  .  /* Ju
6ea0: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
6eb0: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
6ec0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
6ed0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6ee0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
6ef0: 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f  .end_auto_index_
6f00: 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65  create:.  sqlite
6f10: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6f20: 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c  se->db, pPartial
6f30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
6f40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
6f50: 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
6f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6f70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6f80: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6f90: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
6fa0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6fb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
6fc0: 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
6fd0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
6fe0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
6ff0: 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
7000: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
7010: 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
7020: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
7030: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
7040: 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
7050: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
7060: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7070: 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
7080: 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
7090: 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75  rse,.  WhereClau
70a0: 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61  se *pWC,.  Bitma
70b0: 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20  sk mUnusable,   
70c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
70d0: 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20  nore terms with 
70e0: 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f  these prereqs */
70f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7100: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20  t_item *pSrc,.  
7110: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
7120: 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  By.){.  int i, j
7130: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
7140: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7150: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7160: 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
7170: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7180: 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78  ex_orderby *pIdx
7190: 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63  OrderBy;.  struc
71a0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
71b0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
71c0: 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
71d0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
71e0: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
71f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7200: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  fo *pIdxInfo;.. 
7210: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
7220: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
7230: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
7240: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
7250: 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
7260: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7270: 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
7280: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
7290: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
72a0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
72b0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
72c0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
72d0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
72e0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
72f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
7300: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
7310: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
7320: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
7330: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
7340: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
7350: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7360: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7370: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
7380: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7390: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
73a0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
73b0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
73d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
73e0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
73f0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
7400: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7410: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
7420: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c  ISNULL|WO_EQUIV|
7430: 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
7440: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7450: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7460: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
7470: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7480: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
7490: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
74a0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
74b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
74c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
74d0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
74e0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
74f0: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
7500: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
7510: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7520: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
7530: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7540: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7550: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
7560: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
7570: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
7580: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
7590: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
75a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
75b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
75c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
75d0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
75e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
75f0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
7600: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
7610: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
7620: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7630: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
7640: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
7650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7660: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
7670: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7680: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
7690: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
76a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
76b0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
76c0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
76f0: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
7700: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
7710: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
7740: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
7750: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
7760: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
7770: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7780: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
7790: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
77a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
77b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
77c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
77d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
77e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
77f0: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
7800: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
7810: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
7820: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
7830: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
7840: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
7850: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
7860: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
7870: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
7880: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
7890: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
78a0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
78b0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
78c0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
78d0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
78e0: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
78f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7900: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
7910: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
7920: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
7930: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7940: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7950: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
7960: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
7970: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
7980: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
7990: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
79a0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
79b0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
79c0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
79d0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
79e0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
79f0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
7a00: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
7a10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
7a20: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
7a30: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
7a40: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
7a50: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7a60: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7a70: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
7a80: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
7a90: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
7ae0: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
7af0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
7b00: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
7b10: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
7b20: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
7b30: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
7b40: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
7b50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7b60: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
7b70: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
7b80: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
7b90: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
7ba0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
7bb0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
7bc0: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
7bd0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7be0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
7bf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7c00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c10: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
7c20: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7c30: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7c40: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7c50: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7c60: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
7c70: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
7c80: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c90: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
7ca0: 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d  _EQUIV|WO_IS))==
7cb0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7cc0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
7cd0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
7ce0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
7cf0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
7d00: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
7d10: 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43  -1) );.    pIdxC
7d20: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
7d30: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7d40: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
7d50: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
7d60: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
7d70: 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
7d80: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
7d90: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
7da0: 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
7db0: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d 41     if( op==WO_MA
7dc0: 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70 20  TCH ){.      op 
7dd0: 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f  = pTerm->eMatchO
7de0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64  p;.    }.    pId
7df0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
7e00: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
7e10: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
7e20: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
7e30: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
7e40: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
7e50: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
7e60: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7e70: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
7e80: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
7e90: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
7ea0: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
7eb0: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
7ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7ed0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
7ee0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
7ef0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7f00: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
7f10: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
7f20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
7f30: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
7f40: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
7f50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f60: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
7f70: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
7f80: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
7f90: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
7fa0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7fb0: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
7fc0: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
7fd0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7fe0: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
7ff0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8000: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8010: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
8020: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8030: 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
8040: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
8050: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8070: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8080: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8090: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
80a0: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
80b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
80c0: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
80d0: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
80e0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
80f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
8100: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
8110: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
8120: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
8130: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
8140: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8150: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
8160: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
8170: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
8180: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
8190: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
81a0: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
81b0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
81c0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
81d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
81e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
81f0: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
8200: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
8210: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8220: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8230: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
8240: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
8250: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
8260: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
8270: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
8280: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8290: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
82a0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
82b0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
82c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
82d0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
82e0: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
82f0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
8300: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
8310: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
8320: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8330: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
8340: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8350: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
8360: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
8370: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
8380: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
8390: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
83a0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
83b0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
83c0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
83d0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
83e0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
83f0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
8400: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
8410: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
8420: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
8430: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
8440: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
8450: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
8460: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
8470: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
8480: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
8490: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
84a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
84b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
84c0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
84d0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
84e0: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
84f0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
8500: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8520: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8530: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8540: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8560: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8570: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8580: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8590: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
85a0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
85b0: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
85c0: 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f   = 0;..#if 0.  /
85d0: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
85e0: 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68  now caught by th
85f0: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53  e caller..  ** S
8600: 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74  earch for "xBest
8610: 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
8620: 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f  n" below */.  fo
8630: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
8640: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
8650: 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
8660: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
8670: 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
8680: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
8690: 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
86a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
86b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
86c0: 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
86d0: 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
86e0: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
86f0: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
8700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
8710: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
8720: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
8730: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
8740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8750: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
8760: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8770: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
8780: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
8790: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
87a0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
87b0: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
87c0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
87d0: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
87e0: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
87f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
8800: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
8810: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
8820: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
8830: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
8840: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8850: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
8860: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
8870: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
8880: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
8890: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
88a0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
88b0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
88c0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
88d0: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
88e0: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
88f0: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
8900: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8910: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
8920: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
8930: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
8940: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
8950: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8960: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
8970: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
8980: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
8990: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
89a0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
89b0: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
89c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
89d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
89e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
89f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
8a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8a10: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
8a20: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
8a30: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
8a40: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
8a50: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
8a60: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
8a70: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8a90: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
8aa0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
8ab0: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
8ac0: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
8ad0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
8ae0: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
8af0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
8b00: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
8b10: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
8b20: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b40: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
8b50: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
8b60: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
8b70: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8b90: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
8ba0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
8bb0: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
8bd0: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
8be0: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
8bf0: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
8c00: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8c20: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
8c30: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
8c40: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c60: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
8c70: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
8c80: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
8c90: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
8ca0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
8cb0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
8cc0: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
8cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ce0: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
8cf0: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
8d00: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
8d10: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
8d20: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
8d30: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
8d40: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
8d50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8d60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8d70: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
8d80: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
8d90: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
8da0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
8db0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
8dc0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
8dd0: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
8de0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
8df0: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
8e00: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
8e10: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
8e20: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
8e30: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
8e40: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
8e50: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
8e60: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
8e70: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
8e80: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
8e90: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
8ea0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
8eb0: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
8ec0: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
8ed0: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
8ee0: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
8ef0: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
8f00: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
8f10: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
8f20: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
8f30: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
8f40: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
8f50: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
8f60: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
8f70: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
8f80: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
8f90: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
8fa0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
8fb0: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
8fc0: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
8fd0: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
8fe0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
8ff0: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9000: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
9010: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
9020: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
9030: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9040: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
9050: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
9060: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
9070: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9080: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
9090: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
90a0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
90b0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
90c0: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
90d0: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
90e0: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
90f0: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
9100: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
9110: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
9120: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
9130: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
9140: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
9150: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
9160: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
9170: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
9180: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
9190: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
91a0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
91b0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
91c0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
91d0: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
91e0: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
91f0: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
9200: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
9210: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
9220: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
9230: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
9240: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
9250: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
9260: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9270: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
9280: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
9290: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
92a0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
92b0: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
92c0: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
92d0: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
92e0: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
92f0: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
9300: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
9310: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
9320: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
9330: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
9340: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9350: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
9360: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
9370: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
9380: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
9390: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
93a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
93b0: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
93c0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
93d0: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
93e0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
93f0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
9400: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
9410: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
9420: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
9430: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
9440: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
9450: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
9460: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
9470: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
9480: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
9490: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
94a0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
94b0: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
94c0: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
94d0: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
94e0: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
94f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
9500: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
9510: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
9520: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
9530: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
9540: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
9550: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
9560: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
9570: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
9580: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
9590: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
95a0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
95d0: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
95e0: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
95f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9610: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9620: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
9630: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
9640: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
9650: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
9660: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
9670: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
9680: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
9690: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
96a0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
96b0: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
96c0: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
96d0: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
96e0: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
96f0: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
9700: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
9710: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
9720: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
9730: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
9740: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
9750: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
9760: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
9770: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
9780: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
9790: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
97a0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
97b0: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
97c0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
97d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
97e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
97f0: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
9800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
9810: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
9820: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
9830: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9840: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
9850: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
9860: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
9870: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
9880: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
9890: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
98a0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
98b0: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
98c0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
98d0: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
98e0: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
98f0: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
9900: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
9910: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9920: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9930: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
9940: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
9950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
9960: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
9970: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
9980: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
9990: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
99a0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
99b0: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
99c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
99d0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
99e0: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
99f0: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
9a00: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
9a10: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
9a20: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
9a30: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
9a40: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
9a50: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
9a60: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
9a70: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
9a80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
9a90: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9aa0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
9ab0: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
9ac0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
9ad0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
9ae0: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
9af0: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
9b00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9b10: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
9b20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9b30: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
9b40: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
9b50: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
9b60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
9b70: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
9b80: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9b90: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9ba0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
9bb0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9bc0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9bd0: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9bf0: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
9c00: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
9c10: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
9c20: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
9c30: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
9c40: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
9c50: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
9c60: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
9c70: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
9c80: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
9c90: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
9ca0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
9cb0: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
9cc0: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
9cd0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9ce0: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
9cf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9d00: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
9d10: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
9d20: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9d30: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9d40: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
9d50: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
9d60: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9d70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9d80: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
9d90: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
9da0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
9db0: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
9dc0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
9dd0: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
9de0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9df0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
9e00: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
9e10: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
9e20: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
9e30: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
9e40: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
9e50: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
9e60: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
9e70: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
9e80: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
9e90: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
9ea0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
9eb0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
9ec0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
9ed0: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9ef0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9f00: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
9f10: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
9f20: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
9f30: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9f40: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9f50: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
9f60: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
9f70: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
9f80: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
9f90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9fa0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9fb0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9fc0: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
9fd0: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9ff0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
a000: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a010: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
a020: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
a030: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
a040: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
a050: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
a060: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
a070: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
a080: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
a090: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
a0a0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
a0b0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
a0c0: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
a0d0: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
a0e0: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
a0f0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a100: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
a110: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
a120: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
a130: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
a140: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
a150: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
a160: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
a170: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
a180: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
a190: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
a1a0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
a1b0: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
a1c0: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
a1d0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
a1e0: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
a1f0: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
a200: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
a210: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
a220: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
a230: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
a240: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
a250: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
a260: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
a270: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
a280: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
a290: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
a2a0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
a2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a2c0: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
a2d0: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
a2e0: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
a2f0: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
a300: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
a310: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
a320: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
a330: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
a340: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20  Eq[iCol];.  }.. 
a350: 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
a360: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c  pRec->nField val
a370: 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
a380: 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d  ing.  */.  pRec-
a390: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
a3a0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
a3b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a3c0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
a3d0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
a3e0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
a3f0: 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
a400: 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
a410: 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
a420: 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
a430: 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
a440: 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
a450: 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
a460: 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
a470: 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
a480: 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
a490: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
a4a0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
a4b0: 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
a4c0: 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
a4d0: 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
a4e0: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
a4f0: 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
a500: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
a510: 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
a520: 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
a530: 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
a540: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
a550: 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
a560: 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
a570: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
a580: 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
a590: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
a5a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
a5b0: 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
a5c0: 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
a5d0: 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
a5e0: 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
a5f0: 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
a600: 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
a610: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
a620: 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
a630: 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
a640: 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
a650: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
a660: 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
a670: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
a680: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
a690: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
a6a0: 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
a6b0: 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
a6c0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
a6d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
a6e0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
a6f0: 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
a700: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
a710: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
a720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a730: 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23  turn nRet;.}...#
a740: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a750: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a760: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
a770: 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72  the affinity for
a780: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
a790: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
a7a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71 6c  .static char sql
a7b0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
a7c0: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
a7d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
a7e0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61  , int iCol){.  a
a7f0: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
a800: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
a810: 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70  lumn );.  if( !p
a820: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  Idx->zColAff ){.
a830: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a840: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
a850: 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72  db, pIdx)==0 ) r
a860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
a870: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
a880: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
a890: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
a8a0: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
a8b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a8c0: 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
a8d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a8e0: 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
a8f0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
a900: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
a910: 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
a920: 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
a930: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
a940: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
a950: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
a960: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
a970: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a980: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
a990: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
a9a0: 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
a9b0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
a9c0: 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
a9d0: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
a9e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
a9f0: 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
aa00: 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
aa10: 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
aa20: 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
aa30: 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
aa40: 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
aa50: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
aa60: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
aa70: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
aa80: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
aa90: 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
aaa0: 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
aab0: 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
aac0: 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
aad0: 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
aae0: 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
aaf0: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
ab00: 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
ab10: 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
ab20: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
ab30: 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
ab40: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
ab50: 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
ab60: 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
ab70: 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
ab80: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
ab90: 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
aba0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
abb0: 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
abc0: 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
abd0: 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
abe0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
abf0: 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
ac00: 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
ac10: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
ac20: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
ac30: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
ac40: 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
ac50: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
ac60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
ac70: 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
ac80: 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
ac90: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
aca0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
acb0: 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
acc0: 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
acd0: 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
ace0: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
acf0: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
ad00: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ad10: 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
ad20: 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
ad30: 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
ad40: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
ad50: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
ad60: 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
ad70: 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
ad80: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
ad90: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
ada0: 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
adb0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
adc0: 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
add0: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
ade0: 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
adf0: 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
ae00: 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
ae10: 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
ae20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ae30: 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
ae40: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
ae50: 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
ae60: 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
ae70: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ae80: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
ae90: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
aea0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
aeb0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
aec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
aed0: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
aee0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
aef0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
af00: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
af10: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
af20: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
af30: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
af40: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
af50: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
af60: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
af70: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
af80: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
af90: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
afa0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
afb0: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
afc0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
afd0: 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
afe0: 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
aff0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
b000: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
b010: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
b020: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
b030: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
b040: 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
b050: 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
b060: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
b070: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
b080: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
b090: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
b0a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b0b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
b0c0: 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
b0d0: 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
b0e0: 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
b0f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b100: 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65   u8 aff = sqlite
b110: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b120: 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29  nity(db, p, nEq)
b130: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b140: 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
b150: 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
b160: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b170: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b180: 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
b190: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
b1a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b1b0: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b1c0: 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
b1d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b1e0: 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
b1f0: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b200: 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
b210: 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
b220: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b230: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
b240: 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
b250: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
b260: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b270: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
b280: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
b290: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
b2a0: 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
b2b0: 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
b2c0: 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
b2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b2e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b2f0: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b300: 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
b310: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b320: 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
b330: 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
b340: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
b350: 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
b360: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b370: 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
b380: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
b390: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
b3a0: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
b3b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b3c0: 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
b3d0: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
b3e0: 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
b3f0: 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
b400: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b410: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
b420: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b430: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
b440: 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
b450: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
b460: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
b470: 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
b480: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b490: 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
b4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
b4b0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
b4c0: 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
b4d0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
b4e0: 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
b4f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
b500: 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
b510: 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
b520: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
b530: 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
b540: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
b550: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
b560: 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
b570: 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
b580: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
b590: 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
b5a0: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
b5b0: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
b5c0: 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
b5d0: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
b5e0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
b5f0: 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
b600: 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
b610: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
b620: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
b630: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
b640: 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
b650: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
b660: 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
b670: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
b680: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
b690: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
b6a0: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
b6b0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
b6c0: 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
b6d0: 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
b6e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
b6f0: 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
b700: 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
b710: 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
b720: 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
b730: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
b740: 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
b750: 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
b760: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
b770: 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
b780: 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
b790: 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
b7a0: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
b7d0: 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
b7e0: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
b7f0: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
b800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
b810: 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
b820: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
b830: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
b840: 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
b850: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
b860: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
b870: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
b880: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
b890: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b8a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
b8b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
b8c0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b8d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b8e0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
b8f0: 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
b900: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
b910: 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
b920: 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
b930: 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
b940: 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
b950: 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
b960: 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
b970: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
b980: 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
b990: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
b9a0: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
b9b0: 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
b9c0: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
b9d0: 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
b9e0: 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
b9f0: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
ba00: 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
ba10: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
ba20: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
ba30: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
ba40: 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
ba50: 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
ba80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ba90: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
baa0: 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
bab0: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
bac0: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
bad0: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
bae0: 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
baf0: 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
bb00: 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
bb10: 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
bb20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
bb30: 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
bb40: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
bb50: 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d  .nEq) is the num
bb60: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
bb70: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
bb80: 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
bb90: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
bba0: 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
bbb0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
bbc0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
bbd0: 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
bbe0: 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
bbf0: 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
bc00: 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
bc10: 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
bc20: 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
bc30: 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
bc40: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
bc50: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
bc60: 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
bc70: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
bc80: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
bc90: 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
bca0: 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
bcb0: 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
bcc0: 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
bcd0: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
bce0: 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
bcf0: 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
bd00: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
bd10: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
bd20: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
bd30: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
bd40: 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
bd50: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
bd60: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
bd70: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
bd80: 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
bd90: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
bda0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
bdb0: 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
bdc0: 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
bdd0: 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
bde0: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
bdf0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
be00: 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
be10: 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74  then *pnOut is t
be20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
be30: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
be40: 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
be50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
be60: 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
be70: 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
be80: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
be90: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
bea0: 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
beb0: 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
bec0: 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
bed0: 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
bee0: 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
bef0: 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
bf00: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
bf10: 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
bf20: 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
bf30: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
bf40: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
bf50: 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
bf60: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
bf70: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
bf80: 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
bf90: 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
bfa0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
bfb0: 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
bfd0: 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
bfe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bff0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c000: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
c010: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
c020: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
c030: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
c040: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
c050: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
c060: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c070: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
c080: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c090: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
c0a0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
c0b0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c0c0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
c0d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c0e0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
c0f0: 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
c100: 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
c110: 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
c120: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c130: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c140: 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
c150: 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
c160: 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
c170: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c180: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
c190: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c1a0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c1b0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c1c0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c1d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
c1e0: 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  e>0 && nEq<p->nS
c1f0: 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20  ampleCol ){.    
c200: 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
c210: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
c220: 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
c230: 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
c240: 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
c250: 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
c260: 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a  .      u8 aff;..
c270: 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
c280: 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
c290: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
c2a0: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
c2b0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
c2c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
c2d0: 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  x that are less 
c2e0: 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
c2f0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c300: 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20  e query. The.   
c310: 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e     ** lower boun
c320: 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63  d being the conc
c330: 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20  atenation of $P 
c340: 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50  and $L, where $P
c350: 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
c360: 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
c370: 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
c380: 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
c390: 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
c3a0: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
c3b0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
c3c0: 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
c3d0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
c3e0: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  wer..      **.  
c3f0: 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
c400: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
c410: 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
c420: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
c430: 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
c440: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
c450: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
c460: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
c470: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c480: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
c490: 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
c4a0: 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
c4b0: 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
c4c0: 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
c4d0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24  en.      ** if $
c4e0: 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  L is available, 
c4f0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
c500: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f  is called for bo
c510: 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20  th ($P) and .   
c520: 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e     ** ($P:$L) an
c530: 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  d the larger of 
c540: 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64  the two returned
c550: 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e   values is used.
c560: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c570: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
c580: 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
c590: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
c5a0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
c5b0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
c5c0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
c5d0: 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
c5e0: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
c5f0: 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
c600: 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  ound.      ** is
c610: 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
c620: 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
c630: 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
c640: 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
c650: 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  lues.      ** of
c660: 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
c670: 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
c680: 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
c690: 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
c6a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c6b0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
c6c0: 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ows between the 
c6d0: 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68  two bounds is th
c6e0: 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69  en just iUpper-i
c6f0: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  Lower..      */.
c700: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c        tRowcnt iL
c710: 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  ower;     /* Row
c720: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c730: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
c740: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70       tRowcnt iUp
c750: 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  per;     /* Rows
c760: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
c770: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  pper bound */.  
c780: 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20      int iLwrIdx 
c790: 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -2;   /* aSamp
c7a0: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77  le[] for the low
c7b0: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
c7c0: 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20    int iUprIdx = 
c7d0: 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -1;   /* aSample
c7e0: 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72  [] for the upper
c7f0: 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20   bound */..     
c800: 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20   if( pRec ){.   
c810: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c820: 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75  Rec->nField!=pBu
c830: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c840: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63   );.        pRec
c850: 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c  ->nField = pBuil
c860: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
c870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 66        }.      af
c880: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
c890: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
c8a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45  Parse->db, p, nE
c8b0: 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q);.      assert
c8c0: 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43 6f  ( nEq!=p->nKeyCo
c8d0: 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  l || aff==SQLITE
c8e0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
c8f0: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
c900: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
c910: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
c920: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
c930: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
c940: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
c950: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
c960: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
c970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c980: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
c990: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
c9a0: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
c9b0: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
c9c0: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
c9d0: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
c9e0: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
c9f0: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
ca00: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
ca10: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
ca20: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
ca30: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
ca40: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
ca50: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
ca60: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
ca70: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
ca80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
ca90: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
caa0: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
cab0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
cac0: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
cad0: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
cae0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
caf0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cb00: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
cb10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cb20: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
cb30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
cb40: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
cb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
cb60: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
cb70: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
cb80: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
cb90: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
cba0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
cbb0: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
cbc0: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Upper);.      }.
cbd0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
cbe0: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
cbf0: 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
cc00: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
cc10: 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
cc20: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
cc30: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
cc60: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
cc70: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
cc80: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
cc90: 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
cca0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
ccb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
ccc0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
ccd0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
cce0: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
ccf0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
cd00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cd10: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
cd20: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
cd30: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
cd40: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
cd50: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
cd60: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
cd70: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
cd80: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
cd90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cda0: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
cdb0: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
cdc0: 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
cdd0: 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
cde0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
cdf0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
ce00: 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
ce10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
ce20: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
ce30: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
ce40: 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
ce50: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
ce60: 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
ce70: 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
ce80: 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cea0: 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
ceb0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
cec0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
ced0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
cee0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
cef0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
cf00: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
cf10: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
cf20: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
cf30: 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
cf40: 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
cf50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cf60: 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
cf70: 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
cf80: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
cf90: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
cfa0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
cfb0: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
cfc0: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
cfd0: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
cfe0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cff0: 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b  _GT|WO_LE)) ? a[
d000: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
d010: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
d020: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
d030: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
d040: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
d050: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
d060: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d070: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
d080: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
d090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
d0b0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
d0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
d0d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
d0e0: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
d0f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
d100: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
d110: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
d120: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
d130: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
d140: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
d150: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
d160: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
d170: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
d180: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
d190: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
d1a0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
d1b0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
d1c0: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
d1d0: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
d1e0: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
d1f0: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
d200: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
d210: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
d220: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
d230: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
d240: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
d250: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
d260: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d270: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
d280: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
d290: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
d2a0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
d2b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d2c0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
d2d0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
d2e0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
d2f0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
d300: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
d310: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
d320: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
d350: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
d360: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
d370: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d380: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
d390: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
d3a0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
d3b0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
d3c0: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
d3d0: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
d3e0: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
d3f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d400: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
d410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
d420: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
d430: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
d440: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
d450: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
d460: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
d470: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
d480: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
d490: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
d4a0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
d4b0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
d4c0: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
d4d0: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
d4e0: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
d4f0: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
d500: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
d510: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
d520: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
d530: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
d540: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
d550: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
d560: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
d570: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
d580: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
d590: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
d5a0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
d5b0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
d5c0: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
d5d0: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
d5e0: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
d5f0: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
d600: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
d610: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
d620: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
d630: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
d640: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
d650: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
d660: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
d670: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
d680: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
d690: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
d6a0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
d6b0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
d6c0: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d6d0: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
d6e0: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
d6f0: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
d700: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
d710: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
d720: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
d730: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
d740: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
d750: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
d760: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
d770: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
d780: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d790: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
d7a0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
d7b0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
d7e0: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
d7f0: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
d800: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
d810: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d820: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d830: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
d840: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
d850: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
d860: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
d870: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
d880: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
d890: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d8a0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
d8b0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
d8c0: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
d8d0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
d8e0: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
d8f0: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
d900: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
d910: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
d920: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
d930: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
d940: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
d950: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
d960: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
d970: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
d980: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
d990: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
d9a0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
d9b0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
d9c0: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
d9d0: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
d9e0: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
d9f0: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
da00: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
da10: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
da20: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
da30: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
da40: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
da50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
da60: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
da70: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
da80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
da90: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
daa0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
dab0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
dac0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
dad0: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
dae0: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
daf0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
db00: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
db10: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
db20: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
db30: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
db40: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
db50: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
db60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
db70: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
db80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
db90: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
dba0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
dbb0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
dbc0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
dbd0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
dbe0: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
dbf0: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
dc00: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
dc10: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
dc20: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
dc30: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
dc40: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
dc50: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
dc60: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
dc70: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
dc80: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
dc90: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
dca0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
dcb0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
dcc0: 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20  Rec;.  u8 aff;  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
dcf0: 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
dd20: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
dd30: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd50: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
dd60: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
dd70: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
dd80: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
dd90: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
dda0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
ddb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ddc0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
ddd0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
dde0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
ddf0: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
de00: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
de10: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
de20: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
de30: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
de40: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
de50: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
de60: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
de70: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
de80: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
de90: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
dea0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
dec0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
ded0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
dee0: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
def0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
df00: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
df10: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
df20: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
df30: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
df40: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
df50: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
df60: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
df70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df80: 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73 71  .  }..  aff = sq
df90: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
dfa0: 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d  Affinity(pParse-
dfb0: 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b 0a  >db, p, nEq-1);.
dfc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
dfd0: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
dfe0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
dff0: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
e000: 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
e010: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
e020: 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
e030: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e040: 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
e050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e060: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
e070: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e080: 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
e090: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
e0a0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
e0b0: 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
e0c0: 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79  (0x10,("equality
e0d0: 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25 73   scan regions %s
e0e0: 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20  (%d): %d\n",.   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c  p->zName, nEq-1,
e110: 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20   (int)a[1]));.  
e120: 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20  *pnRow = a[1];. 
e130: 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
e140: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e150: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e160: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64  R_STAT4 */..#ifd
e170: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e180: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
e190: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
e1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
e1b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
e1c0: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
e1d0: 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
e1e0: 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
e1f0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
e200: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
e210: 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
e220: 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
e230: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
e240: 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
e250: 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
e260: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
e270: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
e280: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
e290: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
e2a0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
e2b0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
e2c0: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
e2d0: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
e2e0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
e2f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e300: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
e310: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
e320: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
e330: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
e340: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
e350: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
e360: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
e370: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
e380: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
e390: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
e3a0: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
e3b0: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
e3c0: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
e3d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
e3e0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
e3f0: 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
e400: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e410: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
e420: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
e430: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e440: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
e450: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73  ilder,.  ExprLis
e460: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
e470: 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
e480: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
e490: 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
e4a0: 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  .)" */.  tRowcnt
e4b0: 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
e4c0: 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
e4d0: 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
e4e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
e4f0: 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
e500: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
e510: 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52  pIndex;.  i64 nR
e520: 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ow0 = sqlite3Log
e530: 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
e540: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69  wLogEst[0]);.  i
e550: 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
e560: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e570: 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
e580: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
e590: 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
e5a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
e5b0: 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
e5c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e5d0: 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
e5e0: 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
e5f0: 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
e600: 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
e610: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
e620: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
e630: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e650: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e660: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
e670: 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
e680: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e690: 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
e6a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
e6b0: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
e6c0: 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
e6d0: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
e6e0: 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
e6f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
e700: 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
e710: 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
e720: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e730: 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
e740: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
e750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e760: 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f  f( nRowEst > nRo
e770: 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e  w0 ) nRowEst = n
e780: 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  Row0;.    *pnRow
e790: 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
e7a0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
e7b0: 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
e7c0: 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52  e: est=%d\n", nR
e7d0: 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61  owEst));.  }.  a
e7e0: 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
e7f0: 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63  >nRecValid==nRec
e800: 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72  Valid );.  retur
e810: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e820: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
e830: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
e840: 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  /...#ifdef WHERE
e850: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
e860: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
e870: 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65  ntent of a Where
e880: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Term object.*/.s
e890: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
e8a0: 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54  TermPrint(WhereT
e8b0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20  erm *pTerm, int 
e8c0: 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  iTerm){.  if( pT
e8d0: 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  erm==0 ){.    sq
e8e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e8f0: 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c  ("TERM-%-3d NULL
e900: 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d  \n", iTerm);.  }
e910: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
e920: 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d  Type[4];.    mem
e930: 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22  cpy(zType, "..."
e940: 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 4);.    if( pT
e950: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
e960: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54  ERM_VIRTUAL ) zT
e970: 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20  ype[0] = 'V';.  
e980: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
e990: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
e9a0: 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20  V  ) zType[1] = 
e9b0: 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70  'E';.    if( Exp
e9c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
e9d0: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
e9e0: 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
e9f0: 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71  2] = 'L';.    sq
ea00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
ea10: 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25  (.       "TERM-%
ea20: 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72  -3d %p %s cursor
ea30: 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20  =%-3d prob=%-3d 
ea40: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
ea50: 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20  s=0x%04x\n",.   
ea60: 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d      iTerm, pTerm
ea70: 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e  , zType, pTerm->
ea80: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ea90: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20  m->truthProb,.  
eaa0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
eab0: 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74  rator, pTerm->wt
eac0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69  Flags);.    sqli
ead0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
eae0: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
eaf0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
eb00: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
eb10: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
eb20: 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
eb30: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
eb40: 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
eb50: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
eb60: 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
eb70: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
eb80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
eb90: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
eba0: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
ebb0: 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
ebc0: 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
ebd0: 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a  ist->nSrc+3)/4;.
ebe0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ebf0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
ec00: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
ec10: 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
ec20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
ec30: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69 74  tem->pTab;.  Bit
ec40: 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28 42  mask mAll = (((B
ec50: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a 34  itmask)1)<<(nb*4
ec60: 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  )) - 1;.  sqlite
ec70: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
ec80: 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
ec90: 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
ecc0: 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
ecd0: 2d 3e 70 72 65 72 65 71 20 26 20 6d 41 6c 6c 29  ->prereq & mAll)
ece0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
ecf0: 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
ed20: 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
ed30: 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
ed40: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
ed50: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
ed60: 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
ed70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ed80: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
ed90: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
eda0: 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
edb0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
edc0: 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
edd0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
ede0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
edf0: 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
ee00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
ee10: 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
ee20: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
ee30: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
ee40: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
ee50: 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
ee60: 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
ee70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
ee80: 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
ee90: 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
eea0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
eeb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eec0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
eed0: 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
eee0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
eef0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
ef00: 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
ef10: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
ef20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
ef30: 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
ef40: 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
ef50: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
ef60: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
ef70: 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
ef80: 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
ef90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
efa0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
efb0: 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
efc0: 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
efd0: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
efe0: 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
eff0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f000: 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
f010: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f020: 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (z);.  }.  if( p
f030: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f040: 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20  E_SKIPSCAN ){.  
f050: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f060: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 25 64  intf(" f %05x %d
f070: 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73  -%d", p->wsFlags
f080: 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e  , p->nLTerm,p->n
f090: 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Skip);.  }else{.
f0a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f0b0: 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20  Printf(" f %05x 
f0c0: 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67  N %d", p->wsFlag
f0d0: 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20  s, p->nLTerm);. 
f0e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
f0f0: 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25  gPrintf(" cost %
f100: 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72  d,%d,%d\n", p->r
f110: 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20  Setup, p->rRun, 
f120: 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20  p->nOut);.  if( 
f130: 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71  p->nLTerm && (sq
f140: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
f150: 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
f160: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
f170: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65  r(i=0; i<p->nLTe
f180: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
f190: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70  whereTermPrint(p
f1a0: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b  ->aLTerm[i], i);
f1b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
f1c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
f1d0: 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69  rt bulk memory i
f1e0: 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72  nto a valid Wher
f1f0: 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62  eLoop that can b
f200: 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77  e passed.** to w
f210: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61  hereLoopClear ha
f220: 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61  rmlessly..*/.sta
f230: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f240: 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70  opInit(WhereLoop
f250: 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72   *p){.  p->aLTer
f260: 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61  m = p->aLTermSpa
f270: 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20  ce;.  p->nLTerm 
f280: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  = 0;.  p->nLSlot
f290: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   = ArraySize(p->
f2a0: 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20  aLTermSpace);.  
f2b0: 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
f2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
f2d0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75  he WhereLoop.u u
f2e0: 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65  nion.  Leave Whe
f2f0: 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e  reLoop.pLTerm in
f300: 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tact..*/.static 
f310: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
f320: 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33  earUnion(sqlite3
f330: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
f340: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73  *p){.  if( p->ws
f350: 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56  Flags & (WHERE_V
f360: 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52  IRTUALTABLE|WHER
f370: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b  E_AUTO_INDEX) ){
f380: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
f390: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
f3a0: 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26  TUALTABLE)!=0 &&
f3b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
f3c0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
f3d0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76  ite3_free(p->u.v
f3e0: 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
f3f0: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
f400: 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
f410: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
f420: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 0;.    }else
f430: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
f440: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f450: 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
f460: 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
f470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f480: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
f490: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
f4a0: 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71  olAff);.      sq
f4b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f4c0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f4d0: 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62  x);.      p->u.b
f4e0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
f4f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f500: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69  .** Deallocate i
f510: 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75  nternal memory u
f520: 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f  sed by a WhereLo
f530: 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
f540: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f550: 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  opClear(sqlite3 
f560: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f570: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  p){.  if( p->aLT
f580: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
f590: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
f5a0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
f5b0: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
f5c0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
f5d0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
f5e0: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
f5f0: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
f600: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
f610: 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
f620: 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
f630: 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
f640: 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
f650: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f660: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
f670: 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
f680: 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
f690: 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
f6a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f6b0: 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
f6c0: 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
f6d0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
f6e0: 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
f6f0: 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
f700: 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
f710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f720: 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
f730: 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
f740: 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
f750: 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
f760: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
f770: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
f780: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
f790: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
f7a0: 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
f7b0: 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
f7c0: 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
f7d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f7e0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
f7f0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
f800: 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
f810: 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
f820: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f830: 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
f840: 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
f850: 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
f860: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
f870: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
f880: 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
f890: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
f8a0: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
f8b0: 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
f8c0: 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
f8d0: 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
f8e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f8f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
f900: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54  .  }.  memcpy(pT
f910: 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f  o, pFrom, WHERE_
f920: 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20  LOOP_XFER_SZ);. 
f930: 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54   memcpy(pTo->aLT
f940: 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65  erm, pFrom->aLTe
f950: 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a  rm, pTo->nLTerm*
f960: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65  sizeof(pTo->aLTe
f970: 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  rm[0]));.  if( p
f980: 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
f990: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
f9a0: 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  LE ){.    pFrom-
f9b0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
f9c0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
f9d0: 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  ( (pFrom->wsFlag
f9e0: 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
f9f0: 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
fa00: 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70  pFrom->u.btree.p
fa10: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Index = 0;.  }. 
fa20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fa30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
fa40: 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
fa50: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
fa60: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
fa70: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
fa80: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fa90: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
faa0: 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
fab0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
fad0: 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
fae0: 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
faf0: 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
fb00: 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
fb10: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
fb20: 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
fb30: 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
fb40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
fb50: 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
fb60: 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
fb70: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
fb80: 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
fb90: 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
fba0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26  pLevel->pWLoop &
fbb0: 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  & (pLevel->pWLoo
fbc0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
fbd0: 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20  RE_IN_ABLE) ){. 
fbe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
fbf0: 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
fc00: 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
fc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fc20: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
fc30: 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
fc40: 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
fc50: 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
fc60: 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
fc70: 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
fc80: 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
fc90: 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
fca0: 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
fcb0: 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
fcc0: 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
fcd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
fce0: 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
fcf0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
fd00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
fd10: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
fd20: 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
fd30: 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
fd40: 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
fd50: 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
fd60: 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20  *   (2)  X is a 
fd70: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
fd80: 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73   Y.**   (3)  X s
fd90: 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
fda0: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
fdb0: 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f   Y.**.** By "pro
fdc0: 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d  per subset" we m
fdd0: 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20  ean that X uses 
fde0: 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
fdf0: 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e  se terms.** than
fe00: 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
fe10: 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
fe20: 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
fe30: 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79   also used.** by
fe40: 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69   Y..**.** If X i
fe50: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
fe60: 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73  t of Y then Y is
fe70: 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65   a better choice
fe80: 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f   and ought.** to
fe90: 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
fea0: 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
feb0: 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77  e returns TRUE w
fec0: 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a  hen that cost .*
fed0: 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69  * relationship i
fee0: 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e  s inverted and n
fef0: 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73  eeds to be adjus
ff00: 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20  ted.  The third 
ff10: 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65  rule.** was adde
ff20: 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75  d because if X u
ff30: 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65  ses skip-scan le
ff40: 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69  ss than Y it sti
ff50: 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65  ll might.** dese
ff60: 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  rve a lower cost
ff70: 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
ff80: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
ff90: 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f Y..*/.static i
ffa0: 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
ffb0: 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
ffc0: 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
ffd0: 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
ffe0: 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
fff0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
10000 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
10010 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
10020 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
10030 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
10040 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
10050 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
10060 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
10070 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
10080 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
10090 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
100a0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
100b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
100c0 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
100d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
100e0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
100f0 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
10100 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
10110 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
10120 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
10130 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
10140 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
10150 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
10160 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
10170 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10180 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
10190 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
101a0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
101b0 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
101c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
101d0 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
101e0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
101f0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
10200 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
10210 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
10220 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10230 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
10240 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
10250 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
10260 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
10270 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
10280 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
10290 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
102a0 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
102b0 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
102c0 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
102d0 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
102e0 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
102f0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
10300 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
10310 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
10320 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10330 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
10340 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
10350 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
10360 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
10370 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
10380 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
10390 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
103a0 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
103b0 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
103c0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
103d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
103e0 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
103f0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10400 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
10410 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
10420 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
10430 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
10440 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
10450 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
10460 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
10470 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
10480 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10490 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
104a0 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
104b0 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
104c0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
104d0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
104e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
104f0 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
10500 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
10510 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
10520 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
10530 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
10540 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10550 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
10560 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
10570 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
10580 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
10590 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
105a0 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
105b0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
105c0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
105d0 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
105e0 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
105f0 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
10600 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
10610 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10620 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
10630 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
10640 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
10650 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
10670 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
10680 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
10690 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
106a0 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
106b0 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
106c0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
106d0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
106e0 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
106f0 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
10700 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
10710 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
10720 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
10730 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
10740 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
10750 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
10760 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
10770 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
10780 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
10790 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
107a0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
107b0 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
107c0 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
107d0 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
107e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107f0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
10800 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
10810 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
10820 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
10830 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10840 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
10850 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10860 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
10870 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
10880 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
10890 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
108a0 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
108b0 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
108c0 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
108d0 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
108e0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
108f0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
10900 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
10910 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
10920 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
10930 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
10940 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
10950 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
10960 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
10970 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
10980 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
10990 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
109a0 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
109b0 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
109c0 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
109d0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
109e0 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
109f0 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
10a00 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
10a10 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
10a20 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
10a30 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
10a40 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
10a50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
10a60 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
10a70 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
10a80 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
10a90 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
10aa0 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
10ab0 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
10ac0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
10ad0 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
10ae0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
10af0 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
10b00 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
10b10 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
10b20 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10b30 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10b40 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
10b50 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
10b60 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
10b70 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
10b80 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
10b90 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
10ba0 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
10bb0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
10bc0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
10bd0 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
10be0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
10bf0 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
10c00 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
10c10 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
10c20 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
10c30 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
10c40 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
10c50 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
10c60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
10c70 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
10c80 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
10c90 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
10ca0 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
10cb0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
10cc0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
10cd0 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
10ce0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
10cf0 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
10d00 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
10d10 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
10d20 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
10d30 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
10d40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
10d50 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
10d60 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
10d70 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
10d80 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
10d90 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
10da0 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
10db0 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
10dc0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
10dd0 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
10de0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
10df0 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
10e00 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
10e10 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
10e20 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
10e30 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
10e40 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
10e50 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
10e60 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
10e70 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
10e80 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
10e90 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
10ea0 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
10eb0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
10ec0 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
10ed0 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
10ee0 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
10ef0 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
10f00 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
10f10 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
10f20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
10f30 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
10f40 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10f50 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
10f60 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
10f70 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
10f80 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
10f90 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
10fa0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
10fb0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
10fc0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
10fd0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
10fe0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
10ff0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
11000 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
11010 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
11020 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
11030 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
11040 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
11050 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
11060 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
11070 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
11080 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
11090 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
110a0 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
110b0 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
110c0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
110d0 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
110e0 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
110f0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
11100 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
11110 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
11120 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
11130 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
11140 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
11150 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
11160 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
11170 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
11180 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
11190 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
111a0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
111b0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
111c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
111d0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
111e0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
111f0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
11200 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
11210 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
11220 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11230 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
11240 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
11250 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
11260 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
11270 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
11280 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
11290 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
112a0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
112b0 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
112c0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
112d0 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
112e0 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
112f0 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
11300 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
11310 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
11320 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
11330 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
11340 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11350 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
11360 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11370 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11380 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
11390 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
113a0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
113b0 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
113c0 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
113f0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
11400 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
11430 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11440 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11450 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11460 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
11470 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
11480 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
11490 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
114a0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
114b0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
114c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
114d0 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
114e0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
114f0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
11500 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
11510 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
11520 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
11530 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11540 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
11550 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
11560 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
11570 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
11580 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
11590 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
115a0 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
115b0 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
115c0 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
115d0 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
115e0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
115f0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
11600 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
11610 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
11620 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
11630 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
11640 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
11650 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
11660 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
11670 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11680 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
11690 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
116a0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
116b0 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
116c0 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
116d0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
116e0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
116f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
11700 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
11710 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11720 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
11730 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
11740 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
11750 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
11760 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
11770 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
11780 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
11790 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
117a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
117b0 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
117c0 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
117d0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
117e0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
117f0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
11800 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
11810 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
11820 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
11830 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
11840 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
11850 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
11860 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
11870 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
11880 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
11890 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
118a0 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
118b0 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
118c0 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
118d0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
118e0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
118f0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
11900 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
11910 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
11920 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11930 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
11940 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
11950 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
11960 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
11970 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
11980 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
11990 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
119a0 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
119b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
119c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
119d0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
119e0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
119f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
11a00 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  c;..  /* If pBui
11a10 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
11a20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
11a30 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
11a40 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
11a50 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
11a60 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
11a70 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
11a80 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
11a90 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
11aa0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
11ab0 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
11ac0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ad0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
11ae0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
11af0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
11b00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
11b10 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
11b20 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
11b30 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11b60 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
11b70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11b80 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11ba0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11bc0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11bd0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
11be0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
11bf0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
11c00 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
11c10 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11c20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11c30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11c50 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
11c60 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11c70 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
11c80 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
11c90 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
11ca0 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
11cb0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11cc0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
11cd0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
11ce0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
11cf0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
11d00 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
11d10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
11d20 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
11d30 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
11d40 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
11d50 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11d60 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
11d70 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
11d80 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
11d90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11da0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11db0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
11dc0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
11dd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
11de0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
11df0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
11e00 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
11e10 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
11e20 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
11e30 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11e40 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
11e50 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
11e60 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
11e70 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
11e80 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
11e90 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
11ea0 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
11eb0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
11ec0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
11ed0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
11ee0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
11ef0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
11f00 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
11f10 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
11f20 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11f30 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11f50 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11f60 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
11f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11f80 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
11f90 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
11fa0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
11fb0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11fc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11fd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11fe0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
11ff0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12000 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12010 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12020 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12030 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12040 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12050 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12060 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12070 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12080 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12090 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
120a0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
120b0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
120c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
120d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
120e0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
120f0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
12100 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
12110 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12120 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12130 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
12140 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
12150 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
12160 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
12170 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
12180 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
12190 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
121a0 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
121b0 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
121c0 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
121d0 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
121e0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
121f0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
12200 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
12210 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
12220 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
12230 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
12240 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
12250 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
12260 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
12270 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
12280 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
12290 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
122a0 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
122b0 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
122c0 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
122d0 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
122e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
122f0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
12300 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
12310 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
12320 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12330 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
12340 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
12350 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
12360 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
12370 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
12380 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
12390 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
123a0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
123b0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
123c0 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
123d0 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
123e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
123f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
12400 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
12410 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
12420 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
12430 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12440 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
12450 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
12460 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
12470 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
12490 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
124a0 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
124b0 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
124c0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
124d0 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
124e0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
124f0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
12500 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
12510 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
12520 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
12530 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
12540 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
12550 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12560 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12570 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12580 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12590 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
125a0 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
125b0 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
125c0 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
125d0 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
125e0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
125f0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
12600 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
12610 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
12620 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
12630 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
12640 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
12650 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12660 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12670 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12680 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12690 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
126a0 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
126b0 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
126c0 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
126d0 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
126e0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
126f0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
12700 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
12710 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
12720 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
12730 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
12740 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
12750 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12760 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12770 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12780 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12790 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
127a0 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
127b0 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
127c0 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
127d0 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
127e0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
127f0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
12800 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
12810 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
12820 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
12830 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
12840 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
12850 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12860 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12870 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12880 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12890 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
128a0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
128b0 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
128c0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
128d0 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
128e0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
128f0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
12900 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
12910 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
12920 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
12930 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
12940 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
12950 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
12960 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
12970 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
12980 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
12990 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
129a0 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
129b0 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
129c0 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
129d0 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
129e0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
129f0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
12a00 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
12a10 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
12a20 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
12a30 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
12a40 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
12a50 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
12a60 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12a70 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
12a80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12a90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
12aa0 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
12ab0 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
12ac0 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
12ad0 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
12ae0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12af0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
12b00 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
12b10 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12b20 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
12b30 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
12b40 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
12b50 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
12b60 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
12b70 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
12b80 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
12b90 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
12ba0 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
12bb0 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
12bc0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
12bd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
12be0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
12bf0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
12c00 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
12c10 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
12c20 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
12c30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12c40 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
12c50 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
12c60 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
12c70 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
12c80 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
12c90 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
12ca0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
12cb0 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
12cc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12cd0 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
12ce0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
12cf0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
12d00 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
12d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
12d20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12d30 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
12d40 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
12d50 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
12d60 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
12d70 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
12d80 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
12d90 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
12da0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
12db0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
12dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
12dd0 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
12de0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
12df0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
12e00 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
12e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
12e20 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
12e30 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
12e40 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
12e50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
12e60 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
12e70 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
12e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e90 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
12ea0 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
12eb0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12ec0 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
12ed0 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
12ee0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
12ef0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
12f00 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
12f10 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
12f20 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
12f30 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
12f40 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
12f50 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
12f60 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
12f70 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12f80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12f90 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
12fa0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
12fb0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12fc0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12fd0 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
12fe0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
12ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13000 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
13010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13020 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13040 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13050 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13080 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13090 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
130a0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
130b0 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
130c0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
130d0 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
130e0 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
130f0 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
13100 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
13110 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
13120 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
13130 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
13140 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
13150 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
13160 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13170 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
13180 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
13190 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
131a0 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
131b0 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
131c0 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
131d0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
131e0 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
131f0 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
13200 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
13210 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
13220 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
13230 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
13240 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
13250 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
13260 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
13270 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
13280 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
13290 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
132a0 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
132b0 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
132c0 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
132d0 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
132e0 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
132f0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
13300 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
13310 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
13320 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
13330 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
13340 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
13350 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13360 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
13370 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
13380 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
13390 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
133a0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
133b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
133c0 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
133d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
133e0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
133f0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
13400 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
13410 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
13440 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
13450 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
13460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
13470 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
13480 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
13490 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
134a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
134b0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
134c0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
134d0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
134e0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
134f0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
13500 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13510 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
13520 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13530 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
13540 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
13550 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
13560 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13570 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
13580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
13590 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
135a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
135b0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
135c0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
135d0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
135e0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
135f0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
13600 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13620 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
13630 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
13640 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
13650 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
13660 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13670 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
13680 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
13690 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
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 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
136d0 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136f0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
13700 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
13710 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
13720 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
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 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
13760 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
13770 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13780 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13790 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
137a0 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
137b0 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
137c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
137d0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
137e0 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
137f0 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
13800 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13810 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
13820 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
13830 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
13840 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
13850 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13860 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
13870 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
13880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13890 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
138a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
138b0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138d0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
138e0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
138f0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
13900 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
13910 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
13920 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
13930 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
13940 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
13950 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13960 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
13970 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13980 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
13990 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
139a0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
139b0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
139c0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
139d0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
139e0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
139f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
13a00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
13a10 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
13a20 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
13a30 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
13a40 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
13a50 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
13a60 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_LE|WO_ISNULL|
13a70 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28  WO_IS;.  }.  if(
13a80 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
13a90 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20  red ) opMask &= 
13aa0 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  ~(WO_GT|WO_GE|WO
13ab0 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61  _LT|WO_LE);..  a
13ac0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
13ad0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
13ae0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73  >nColumn );..  s
13af0 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
13b00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
13b10 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
13b20 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76  ew->nSkip;.  sav
13b30 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
13b40 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
13b50 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
13b60 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
13b70 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
13b80 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
13b90 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
13ba0 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77  Out;.  pTerm = w
13bb0 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
13bc0 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
13bd0 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
13be0 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20  , saved_nEq,.   
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
13c10 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  obe);.  pNew->rS
13c20 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a  etup = 0;.  rSiz
13c30 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
13c40 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c  wLogEst[0];.  rL
13c50 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
13c60 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20  rSize);.  for(; 
13c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c80 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
13c90 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
13ca0 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31  (&scan)){.    u1
13cb0 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  6 eOp = pTerm->e
13cc0 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53  Operator;   /* S
13cd0 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65  horthand for pTe
13ce0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  rm->eOperator */
13cf0 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73  .    LogEst rCos
13d00 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74  tIdx;.    LogEst
13d10 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
13d20 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20          /* nOut 
13d30 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20  before IN() and 
13d40 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74  WHERE adjustment
13d50 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e  s */.    int nIn
13d60 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
13d70 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
13d80 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e  _OR_STAT4.    in
13d90 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
13da0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13db0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  d;.#endif.    if
13dc0 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  ( (eOp==WO_ISNUL
13dd0 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46  L || (pTerm->wtF
13de0 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29  lags&TERM_VNULL)
13df0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64  !=0).     && ind
13e00 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
13e10 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
13e20 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
13e30 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e  continue; /* ign
13e40 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c  ore IS [NOT] NUL
13e50 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  L constraints on
13e60 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
13e70 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  s */.    }.    i
13e80 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
13e90 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
13ea0 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
13eb0 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  e;..    /* Do no
13ec0 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65  t allow the uppe
13ed0 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b  r bound of a LIK
13ee0 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72  E optimization r
13ef0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a  ange constraint.
13f00 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69      ** to mix wi
13f10 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65  th a lower range
13f20 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65   bound from some
13f30 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f   other source */
13f40 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13f50 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
13f60 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d  IKEOPT && pTerm-
13f70 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
13f80 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  T ) continue;.. 
13f90 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
13fa0 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69 6e 74  ow IS constraint
13fb0 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  s from the WHERE
13fc0 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
13fd0 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
13fe0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
13ff0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e  a LEFT JOIN.  On
14000 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ly constraints i
14010 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
14020 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77  are.    ** allow
14030 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  ed */.    if( (p
14040 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
14050 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
14060 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
14070 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
14080 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
14090 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f 70 20  n).     && (eOp 
140a0 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55  & (WO_IS|WO_ISNU
140b0 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  LL))!=0.    ){. 
140c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
140d0 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  Op & WO_IS );.  
140e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
140f0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
14100 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
14110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65 77  .    }..    pNew
14120 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
14130 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
14140 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14150 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
14160 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
14170 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
14180 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
14190 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
141a0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
141b0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
141c0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
141d0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
141e0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
141f0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
14200 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
14210 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
14220 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
14230 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
14240 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
14250 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
14260 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14270 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
14280 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
14290 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
142a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
142b0 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
142c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
142d0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
142e0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
142f0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
14300 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
14310 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
14320 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
14330 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14340 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
14350 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
14360 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14370 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14380 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
14390 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
143a0 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
143b0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
143c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
143d0 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
143e0 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
143f0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
14400 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
14410 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
14420 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
14430 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
14440 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
14450 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
14460 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
14470 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14480 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
14490 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
144a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
144b0 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
144c0 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
144d0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
144e0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
14510 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
14520 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
14530 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
14540 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
14550 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
14560 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
14570 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20  aved_nEq];.     
14580 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
14590 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
145a0 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  Q;.      assert(
145b0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77   saved_nEq==pNew
145c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
145d0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  .      if( iCol=
145e0 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20  =XN_ROWID .     
145f0 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20    || (iCol>0 && 
14600 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
14610 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
14620 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
14630 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14640 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62  iCol>=0 && pProb
14650 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d  e->uniqNotNull==
14660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
14670 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
14680 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
14690 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
146a0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
146b0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
146c0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
146d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
146e0 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
146f0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
14700 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14710 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
14720 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
14730 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
14740 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
14750 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14760 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
14770 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14780 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
14790 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
147a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
147b0 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
147c0 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
147d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
147e0 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Top = 0;.      i
147f0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
14800 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
14810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
14820 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20  ange contraints 
14830 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74  that come from t
14840 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
14850 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20  tion are.       
14860 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20   ** always used 
14870 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20  in pairs. */.   
14880 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65       pTop = &pTe
14890 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  rm[1];.        a
148a0 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54  ssert( (pTop-(pT
148b0 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54  erm->pWC->a))<pT
148c0 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20  erm->pWC->nTerm 
148d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
148e0 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73  t( pTop->wtFlags
148f0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
14900 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
14910 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74  t( pTop->eOperat
14920 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  or==WO_LT );.   
14930 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
14940 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
14950 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
14960 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
14970 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  OM */.        pN
14980 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
14990 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f  >nLTerm++] = pTo
149a0 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  p;.        pNew-
149b0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
149c0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
149d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
149e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
149f0 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  p & (WO_LT|WO_LE
14a00 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
14a10 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54  ase( eOp & WO_LT
14a20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14a30 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20  se( eOp & WO_LE 
14a40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
14a50 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14a60 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
14a70 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
14a80 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
14a90 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
14aa0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14ab0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
14ac0 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
14ad0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
14ae0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
14af0 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
14b00 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
14b10 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e  is point pNew->n
14b20 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
14b30 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14b40 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20   expected to.   
14b50 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62   ** be visited b
14b60 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  y the index scan
14b70 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72   before consider
14b80 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20  ing term pTerm, 
14b90 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  or the.    ** va
14ba0 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20  lues of nIn and 
14bb0 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72  nInMul. In other
14bc0 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67   words, assuming
14bd0 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
14be0 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65  * "x IN(...)" te
14bf0 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64  rms are replaced
14c00 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54   with "x = ?". T
14c10 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  his block update
14c20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  s.    ** the val
14c30 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
14c40 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
14c50 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e  pTerm (but not n
14c60 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a  In/nInMul).  */.
14c70 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
14c80 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
14c90 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ut );.    if( pN
14ca0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14cb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
14cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
14cd0 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73  ust nOut using s
14ce0 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e  tat3/stat4 data.
14cf0 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73   Or, if there is
14d00 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a   no stat3/stat4.
14d10 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75        ** data, u
14d20 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20  sing some other 
14d30 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20  estimate.  */.  
14d40 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
14d50 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14d60 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
14d70 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
14d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
14d90 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e  nEq = ++pNew->u.
14da0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20  btree.nEq;.     
14db0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
14dc0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c  WO_ISNULL|WO_EQ|
14dd0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a  WO_IN|WO_IS) );.
14de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14df0 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
14e00 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69  _nOut );.      i
14e10 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
14e20 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65  rob<=0 && pProbe
14e30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
14e40 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  _nEq]>=0 ){.    
14e50 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70      assert( (eOp
14e60 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e   & WO_IN) || nIn
14e70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
14e80 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
14e90 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
14ea0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  pNew->nOut += pT
14eb0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
14ec0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14ed0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
14ee0 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
14ef0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
14f00 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
14f10 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
14f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
14f30 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20  ( nInMul==0 .   
14f40 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
14f50 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
14f60 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
14f70 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
14f80 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20  >nSampleCol.    
14f90 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20       && ((eOp & 
14fa0 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78  WO_IN)==0 || !Ex
14fb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
14fc0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  erm->pExpr, EP_x
14fd0 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20  IsSelect)).     
14fe0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
14ff0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
15000 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
15010 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
15020 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
15030 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a  L|WO_IS))!=0 ){.
15040 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
15050 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
15060 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
15070 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15080 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
15090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150a0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
150b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
150c0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
150d0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
150e0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70  uilder, pExpr->p
150f0 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  Right, &nOut);. 
15100 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
15110 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15120 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
15130 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
15140 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
15150 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
15160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
15180 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
15190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
151a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
151b0 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20  TE_OK ) break;  
151c0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
151d0 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d  out of the pTerm
151e0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20   loop */.       
151f0 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20     if( nOut ){. 
15200 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
15210 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
15220 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20  ogEst(nOut);.   
15230 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
15240 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f  w->nOut>saved_nO
15250 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  ut ) pNew->nOut 
15260 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
15270 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
15280 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
15290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
152a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
152b0 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a  Out==0 ).#endif.
152c0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
152d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
152e0 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  = (pProbe->aiRow
152f0 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50  LogEst[nEq] - pP
15300 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15310 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20  t[nEq-1]);.     
15320 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
15330 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
15340 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
15350 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  G: If there is n
15360 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  o likelihood() v
15370 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61  alue, assume tha
15380 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20  t a .           
15390 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c   ** "col IS NULL
153a0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  " expression mat
153b0 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61  ches twice as ma
153c0 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20  ny rows .       
153d0 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d       ** as (col=
153e0 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ?). */.         
153f0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
15400 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
15410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15420 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15430 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f   Set rCostIdx to
15440 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
15450 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72  iting selected r
15460 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64  ows in index. Ad
15470 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70  d.    ** it to p
15480 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68  New->rRun, which
15490 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
154a0 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  t to the cost of
154b0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
154c0 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65  * seek only. The
154d0 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  n, if this is a 
154e0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
154f0 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74  ex, add the cost
15500 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74   of.    ** visit
15510 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20  ing the rows in 
15520 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
15530 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78   */.    rCostIdx
15540 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20   = pNew->nOut + 
15550 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
15560 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e  szIdxRow)/pSrc->
15570 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
15580 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
15590 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
155a0 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73  d(rLogSize, rCos
155b0 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28  tIdx);.    if( (
155c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
155d0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
155e0 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
155f0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  {.      pNew->rR
15600 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
15610 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
15620 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  , pNew->nOut + 1
15630 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70  6);.    }.    Ap
15640 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
15650 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50  r(pNew->rRun, pP
15660 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f  robe->pTable->co
15670 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f  stMult);..    nO
15680 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70  utUnadjusted = p
15690 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70  New->nOut;.    p
156a0 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e  New->rRun += nIn
156b0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70  Mul + nIn;.    p
156c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e  New->nOut += nIn
156d0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77  Mul + nIn;.    w
156e0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
156f0 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  just(pBuilder->p
15700 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
15710 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
15720 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
15730 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20  der, pNew);..   
15740 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
15750 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
15760 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
15770 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15780 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65  ved_nOut;.    }e
15790 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
157a0 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64  >nOut = nOutUnad
157b0 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  justed;.    }.. 
157c0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
157d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
157e0 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20  P_LIMIT)==0.    
157f0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
15800 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
15810 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
15820 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
15830 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
15840 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
15850 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
15860 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
15870 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15880 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15890 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
158a0 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
158b0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
158c0 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
158d0 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
158e0 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
158f0 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
15900 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
15910 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  _nEq;.  pNew->nS
15920 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
15930 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  p;.  pNew->wsFla
15940 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
15950 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  gs;.  pNew->nOut
15960 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
15970 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
15980 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20  saved_nLTerm;.. 
15990 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69   /* Consider usi
159a0 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  ng a skip-scan i
159b0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  f there are no W
159c0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
159d0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61  traints.  ** ava
159e0 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ilable for the l
159f0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f  eft-most terms o
15a00 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
15a10 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a   if the average.
15a20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
15a30 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65  epeats in the le
15a40 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73  ft-most terms is
15a50 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20   at least 18. . 
15a60 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67   **.  ** The mag
15a70 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20  ic number 18 is 
15a80 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20  selected on the 
15a90 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e  basis that scann
15aa0 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a  ing 17 rows.  **
15ab0 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
15ac0 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61  s quicker than a
15ad0 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76  n index seek (ev
15ae0 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65  en though if the
15af0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74   index.  ** cont
15b00 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
15b10 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73  2^17 rows we ass
15b20 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e  ume otherwise in
15b30 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a   other parts of.
15b40 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20    ** the code). 
15b50 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20  And, even if it 
15b60 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c  is not, it shoul
15b70 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63  d not be too muc
15b80 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20  h slower. .  ** 
15b90 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
15ba0 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65  d, the extra see
15bb0 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20  ks could end up 
15bc0 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e  being significan
15bd0 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78  tly.  ** more ex
15be0 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61  pensive.  */.  a
15bf0 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74  ssert( 42==sqlit
15c00 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a  e3LogEst(18) );.
15c10 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d    if( saved_nEq=
15c20 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20  =saved_nSkip.   
15c30 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70  && saved_nEq+1<p
15c40 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20  Probe->nKeyCol. 
15c50 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53    && pProbe->noS
15c60 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26  kipScan==0.   &&
15c70 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15c80 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
15c90 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=42  /* TUNING
15ca0 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
15cb0 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
15cc0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
15cd0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
15ce0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
15cf0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
15d00 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
15d10 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
15d20 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
15d30 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a   pNew->nSkip++;.
15d40 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
15d50 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
15d60 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
15d70 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15d80 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
15d90 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Iter = pProbe->a
15da0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
15db0 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  _nEq] - pProbe->
15dc0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
15dd0 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e  d_nEq+1];.    pN
15de0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65  ew->nOut -= nIte
15df0 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  r;.    /* TUNING
15e00 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72  :  Because uncer
15e10 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20  tainties in the 
15e20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b  estimates for sk
15e30 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c  ip-scan queries,
15e40 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e  .    ** add a 1.
15e50 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72  375 fudge factor
15e60 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63   to make skip-sc
15e70 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73  an slightly less
15e80 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20   likely. */.    
15e90 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20  nIter += 5;.    
15ea0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
15eb0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
15ec0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
15ed0 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a  Iter + nInMul);.
15ee0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15ef0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
15f00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15f10 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
15f20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
15f30 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
15f40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15f50 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
15f60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
15f70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
15f80 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69  urn True if it i
15f90 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
15fa0 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20  pIndex might be 
15fb0 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70  useful in.** imp
15fc0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
15fd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
15fe0 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
15ff0 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66   Return False if
16000 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e   pBuilder does n
16010 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52  ot contain an OR
16020 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
16030 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
16040 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65  no way for pInde
16050 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69  x to be useful i
16060 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  n implementing t
16070 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  hat.** ORDER BY 
16080 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
16090 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74  c int indexMight
160a0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
160b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
160c0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
160d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a   Index *pIndex,.
160e0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b    int iCursor.){
160f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42  .  ExprList *pOB
16100 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43  ;.  ExprList *aC
16110 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69  olExpr;.  int ii
16120 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e  , jj;..  if( pIn
16130 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
16140 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16150 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
16160 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
16170 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
16180 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
16190 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69  ii<pOB->nExpr; i
161a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
161b0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
161c0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
161d0 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  OB->a[ii].pExpr)
161e0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
161f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
16200 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
16210 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
16220 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
16230 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
16240 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  1;.      for(jj=
16250 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
16260 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
16270 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16280 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78  >iColumn==pIndex
16290 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29  ->aiColumn[jj] )
162a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
162b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
162c0 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e   (aColExpr = pIn
162d0 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d  dex->aColExpr)!=
162e0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
162f0 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
16300 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
16310 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
16320 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
16330 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74  !=XN_EXPR ) cont
16340 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
16350 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
16360 70 61 72 65 28 70 45 78 70 72 2c 61 43 6f 6c 45  pare(pExpr,aColE
16370 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72  xpr->a[jj].pExpr
16380 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a  ,iCursor)==0 ){.
16390 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
163a0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
163b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
163c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
163d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
163e0 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
163f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
16400 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
16410 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
16420 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
16430 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
16440 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
16450 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
16460 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
16470 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
16480 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
16490 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
164a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
164b0 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
164c0 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
164d0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
164e0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
164f0 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20  ];.    if( x>=0 
16500 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16510 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
16520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
16530 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
16540 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
16550 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
16560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16570 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63  rn m;.}../* Chec
16580 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61  k to see if a pa
16590 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68  rtial index with
165a0 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65   pPartIndexWhere
165b0 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
165c0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  in the current q
165d0 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72  uery.  Return tr
165e0 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20  ue if it can be 
165f0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
16600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16610 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
16620 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62  alIndex(int iTab
16630 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
16640 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65  WC, Expr *pWhere
16650 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
16660 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
16670 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
16680 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
16690 20 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61     if( !whereUsa
166a0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
166b0 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d  iTab,pWC,pWhere-
166c0 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
166d0 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   0;.    pWhere =
166e0 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b   pWhere->pRight;
166f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
16700 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
16710 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
16720 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
16730 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16740 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  rm->pExpr;.    i
16750 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
16760 70 6c 69 65 73 45 78 70 72 28 70 45 78 70 72 2c  pliesExpr(pExpr,
16770 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a   pWhere, iTab) .
16780 20 20 20 20 20 26 26 20 28 21 45 78 70 72 48 61       && (!ExprHa
16790 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
167a0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c   EP_FromJoin) ||
167b0 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
167c0 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20  inTable==iTab). 
167d0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
167e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
167f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16800 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
16810 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
16820 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
16830 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
16840 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
16850 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
16860 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
16870 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
16880 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
16890 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
168a0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
168b0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
168c0 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57  .** The costs (W
168d0 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f  hereLoop.rRun) o
168e0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f  f the b-tree loo
168f0 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69 73  ps added by this
16900 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65   function.** are
16910 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66   calculated as f
16920 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f  ollows:.**.** Fo
16930 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61  r a full scan, a
16940 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c  ssuming the tabl
16950 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e  e (or index) con
16960 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a  tains nRow rows:
16970 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
16980 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20  = nRow * 3.0    
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63  // full-table sc
169b0 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  an.**     cost =
169c0 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20   nRow * K       
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
169e0 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69  / scan of coveri
169f0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
16a00 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b  cost = nRow * (K
16a10 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20 20  +3.0)           
16a20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
16a30 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
16a40 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b  ex.**.** where K
16a50 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74 77   is a value betw
16a60 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20  een 1.1 and 3.0 
16a70 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
16a80 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73   relative .** es
16a90 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20  timated average 
16aa0 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
16ab0 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f  x and table reco
16ac0 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  rds..**.** For a
16ad0 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68  n index scan, wh
16ae0 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74 68  ere nVisit is th
16af0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
16b00 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a  x rows visited.*
16b10 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61  * by the scan, a
16b20 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20  nd nSeek is the 
16b30 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f  number of seek o
16b40 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
16b50 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e  ed on .** the in
16b60 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a  dex b-tree:.**.*
16b70 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
16b80 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
16b90 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20  + K * nVisit)   
16ba0 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69         // coveri
16bb0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
16bc0 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
16bd0 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33  log(nRow) + (K+3
16be0 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20  .0) * nVisit)   
16bf0 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   // non-covering
16c00 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72   index.**.** Nor
16c10 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20  mally, nSeek is 
16c20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20  1. nSeek values 
16c30 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20 63  greater than 1 c
16c40 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68 65  ome about if the
16c50 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73   .** WHERE claus
16c60 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e  e includes "x IN
16c70 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75   (....)" terms u
16c80 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
16c90 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a  "x=?". Or when .
16ca0 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49  ** implicit "x I
16cb0 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
16cc0 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65   tbl)" terms are
16cd0 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d   added for skip-
16ce0 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  scans..**.** The
16cf0 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65   estimated value
16d00 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c  s (nRow, nVisit,
16d10 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f   nSeek) often co
16d20 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d  ntain a large am
16d30 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72  ount.** of uncer
16d40 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69  tainty.  For thi
16d50 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e  s reason, scorin
16d60 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  g is designed to
16d70 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74   pick plans that
16d80 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73  .** "do the leas
16d90 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20 65  t harm" if the e
16da0 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61  stimates are ina
16db0 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78  ccurate.  For ex
16dc0 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28  ample, a.** log(
16dd0 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20  nRow) factor is 
16de0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e  omitted from a n
16df0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16e00 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20  x scan in order 
16e10 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73  to.** bias the s
16e20 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20  coring in favor 
16e30 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
16e40 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72  x, since the wor
16e50 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f  st-case.** perfo
16e60 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20  rmance of using 
16e70 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72 20  an index is far 
16e80 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 20  better than the 
16e90 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f  worst-case perfo
16ea0 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66  rmance.** of a f
16eb0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull table scan..
16ec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
16ed0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
16ee0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
16ef0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
16f00 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
16f10 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
16f20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20  Bitmask mPrereq 
16f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
16f40 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
16f50 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
16f60 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
16f70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
16f80 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
16f90 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
16fa0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
16fb0 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
16fc0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
16fd0 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
16fe0 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
16ff0 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
17000 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
17010 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
17020 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
17030 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52   */.  LogEst aiR
17040 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
17050 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f    /* The aiRowLo
17060 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  gEst[] value for
17070 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
17080 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
17090 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
170a0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
170b0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
170c0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
170d0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
170e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
170f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
17100 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
17110 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
17120 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
17130 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
17140 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
17150 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
17160 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
17170 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17180 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
17190 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
171a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
171b0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
171c0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
171d0 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
171e0 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
17210 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
17220 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
17230 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
17240 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
17250 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
17260 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
17270 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
17280 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
17290 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
172a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
172b0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
172c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
172d0 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
172e0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
172f0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
17300 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
17310 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
17320 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
17330 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
17340 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
17350 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
17360 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
17370 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
17380 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
17390 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
173a0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
173b0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
173c0 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
173d0 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
173e0 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
173f0 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29  pSrc->pIBIndex )
17400 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
17410 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
17420 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
17430 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
17440 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
17450 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  = pSrc->pIBIndex
17460 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48  ;.  }else if( !H
17470 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
17480 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54  .    pProbe = pT
17490 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  ab->pIndex;.  }e
174a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
174b0 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
174c0 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
174d0 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
174e0 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
174f0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
17500 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
17510 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
17520 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
17530 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
17540 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
17550 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
17560 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
17570 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
17580 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
17590 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
175a0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
175b0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
175c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
175d0 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
175e0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
175f0 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
17600 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
17610 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43  );.    sPk.nKeyC
17620 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  ol = 1;.    sPk.
17630 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
17640 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
17650 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
17660 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74   sPk.aiRowLogEst
17670 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
17680 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
17690 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
176a0 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
176b0 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64  ab;.    sPk.szId
176c0 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54  xRow = pTab->szT
176d0 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77  abRow;.    aiRow
176e0 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d  EstPk[0] = pTab-
176f0 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20  >nRowLogEst;.   
17700 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
17710 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   0;.    pFirst =
17720 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
17730 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
17740 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  c->fg.notIndexed
17750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
17760 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
17770 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
17780 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
17790 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
177a0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
177b0 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
177c0 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
177d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
177e0 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
177f0 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
17800 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
17810 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62  }.  rSize = pTab
17820 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
17830 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
17840 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  g(rSize);..#ifnd
17850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17860 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
17870 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
17880 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
17890 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
178a0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72        /* Not par
178b0 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d  t of an OR optim
178c0 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26  ization */.   &&
178d0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
178e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f  lags & WHERE_NO_
178f0 41 55 54 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20  AUTOINDEX)==0.  
17900 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
17910 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
17920 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
17930 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
17940 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20  ->pIBIndex==0   
17950 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44     /* Has no IND
17960 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a  EXED BY clause *
17970 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
17980 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f  g.notIndexed   /
17990 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44  * Has no NOT IND
179a0 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20  EXED clause */. 
179b0 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
179c0 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ab)         /* N
179d0 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ot WITHOUT ROWID
179e0 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20   table. (FIXME: 
179f0 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20  Why not?) */.   
17a00 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43  && !pSrc->fg.isC
17a10 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74  orrelated /* Not
17a20 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
17a30 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20  bquery */.   && 
17a40 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75  !pSrc->fg.isRecu
17a50 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20  rsive  /* Not a 
17a60 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e  recursive common
17a70 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
17a80 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f  n. */.  ){.    /
17a90 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
17aa0 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
17ab0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
17ac0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68  m *pTerm;.    Wh
17ad0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20  ereTerm *pWCEnd 
17ae0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
17af0 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70  nTerm;.    for(p
17b00 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d  Term=pWC->a; rc=
17b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
17b20 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
17b30 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
17b40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
17b50 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
17b60 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
17b70 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
17b80 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
17b90 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
17ba0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
17bb0 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
17bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69        pNew->nSki
17bd0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  p = 0;.        p
17be0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17bf0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
17c00 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
17c10 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
17c20 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
17c30 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  rm;.        /* T
17c40 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20  UNING: One-time 
17c50 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69  cost for computi
17c60 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ng the automatic
17c70 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20   index is.      
17c80 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74    ** estimated t
17c90 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29  o be X*N*log2(N)
17ca0 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
17cb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17cc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
17cd0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
17ce0 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58  exed and where X
17cf0 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38   is 7 (LogEst=28
17d00 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20  ) for normal.   
17d10 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f       ** tables o
17d20 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d  r 1.375 (LogEst=
17d30 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  4) for views and
17d40 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
17d50 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
17d60 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c  ** of X is small
17d70 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  er for views and
17d80 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74   subqueries so t
17d90 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hat the query pl
17da0 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  anner.        **
17db0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67   will be more ag
17dc0 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67  gressive about g
17dd0 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61  enerating automa
17de0 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a  tic indexes for.
17df0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65          ** those
17e00 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20   objects, since 
17e10 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f  there is no oppo
17e20 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73  rtunity to add s
17e30 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a  chema.        **
17e40 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71   indexes on subq
17e50 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73  ueries and views
17e60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
17e70 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
17e80 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34  Size + rSize + 4
17e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
17ea0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26  ab->pSelect==0 &
17eb0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
17ec0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
17ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17ee0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b    pNew->rSetup +
17ef0 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 24;.        }.
17f00 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
17f10 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
17f20 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e  ->rSetup, pTab->
17f30 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
17f40 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
17f50 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
17f60 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
17f70 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
17f80 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
17f90 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
17fa0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
17fb0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
17fc0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
17fd0 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
17fe0 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
17ff0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
18000 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
18010 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
18020 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
18030 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
18040 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
18050 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
18060 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
18070 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
18080 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
18090 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
180a0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
180b0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
180c0 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
180d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
180e0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
180f0 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
18100 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
18110 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
18120 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
18130 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
18140 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
18150 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
18160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18170 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18180 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
18190 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
181a0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
181b0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
181c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
181d0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
181e0 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
181f0 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
18200 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
18210 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
18220 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
18230 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
18240 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
18250 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
18260 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
18270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
18280 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e  ew->iTab!=pSrc->
18290 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53  iCursor );  /* S
182a0 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37  ee ticket [98d97
182b0 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20  3b8f5] */.      
182c0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
182d0 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
182e0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
182f0 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
18300 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  }.    rSize = pP
18310 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
18320 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
18330 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
18340 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
18350 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18360 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
18370 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
18380 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
18390 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
183a0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72  ew->prereq = mPr
183b0 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ereq;.    pNew->
183c0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
183d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
183e0 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
183f0 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
18400 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
18410 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
18420 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
18430 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
18440 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
18450 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
18460 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
18470 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
18480 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
18490 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
184a0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
184b0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
184c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
184d0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
184e0 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
184f0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
18500 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
18510 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
18520 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
18530 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
18540 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
18550 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
18560 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
18570 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
18580 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
18590 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
185a0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
185b0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
185c0 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
185d0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
185e0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
185f0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
18600 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
18610 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
18620 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
18630 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
18640 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
18650 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
18660 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
18670 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
18680 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
18690 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
186a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
186b0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
186c0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
186d0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
186e0 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
186f0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
18700 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
18710 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
18720 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
18730 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
18740 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
18750 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18760 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
18770 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
18780 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
18790 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
187a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
187b0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
187c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
187d0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
187e0 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
187f0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
18800 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
18810 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
18820 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
18830 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
18840 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
18850 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
18860 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
18870 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
18880 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
18890 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
188a0 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
188b0 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
188c0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
188d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
188e0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
188f0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
18900 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
18910 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
18920 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
18930 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
18940 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
18950 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
18960 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
18970 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
18980 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
18990 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
189a0 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
189b0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
189c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
189d0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
189e0 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20  s. If this is a 
189f0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18a00 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20  ex scan,.       
18a10 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65   ** also add the
18a20 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
18a30 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a  g table rows (N*
18a40 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  3.0).  */.      
18a50 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
18a60 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
18a70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
18a80 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
18a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
18aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
18ab0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
18ac0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
18ad0 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31  w->rRun, rSize+1
18ae0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  6);.        }.  
18af0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
18b00 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
18b10 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
18b20 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77  Mult);.        w
18b30 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
18b40 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
18b50 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
18b60 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
18b70 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
18b80 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
18b90 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
18ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18bb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18bc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
18bd0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
18be0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
18bf0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
18c00 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
18c10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
18c20 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
18c30 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
18c40 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
18c50 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
18c60 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
18c70 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
18c80 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
18c90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
18ca0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
18cb0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
18cc0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
18cd0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
18ce0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
18cf0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
18d00 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
18d10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18d30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
18d40 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  E../*.** Argumen
18d50 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c  t pIdxInfo is al
18d60 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
18d70 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
18d80 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a  ints that may.**
18d90 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
18da0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64  virtual table id
18db0 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69  entified by pBui
18dc0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
18dd0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
18de0 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65  on marks a subse
18df0 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74  t of those const
18e00 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69  raints usable, i
18e10 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42  nvokes the.** xB
18e20 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
18e30 61 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74  and adds the ret
18e40 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42  urned plan to pB
18e50 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  uilder..**.** A 
18e60 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61  constraint is ma
18e70 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a  rked usable if:.
18e80 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65  **.**   * Argume
18e90 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63  nt mUsable indic
18ea0 61 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72  ates that its pr
18eb0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
18ec0 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a  available, and.*
18ed0 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e  *.**   * It is n
18ee0 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  ot one of the op
18ef0 65 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65  erators specifie
18f00 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64  d in the mExclud
18f10 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a  e mask passed.**
18f20 20 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72       as the four
18f30 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69  th argument (whi
18f40 63 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69  ch in practice i
18f50 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f  s either WO_IN o
18f60 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  r 0)..**.** Argu
18f70 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20  ment mPrereq is 
18f80 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  a mask of tables
18f90 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
18fa0 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
18fb0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
18fc0 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54  e in question. T
18fd0 68 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74  hese are added t
18fe0 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72  o the plans prer
18ff0 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66  equisites.** bef
19000 6f 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ore it is added 
19010 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
19020 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  ** Output parame
19030 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74  ter *pbIn is set
19040 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
19050 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42  plan added to pB
19060 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f  uilder.** uses o
19070 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e  ne or more WO_IN
19080 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65   terms, or false
19090 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
190a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
190b0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
190c0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
190d0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
190e0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
190f0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q,              
19100 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
19110 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
19120 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d   used. */.  Bitm
19130 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20  ask mUsable,    
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19150 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61  ask of usable ta
19160 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45  bles */.  u16 mE
19170 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20  xclude,         
19180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63            /* Exc
19190 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67  lude terms using
191a0 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73   these operators
191b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
191c0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
191d0 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
191e0 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
191f0 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  estIndex */.  in
19200 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19220 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
19230 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
19240 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
19250 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
19260 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
19270 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
19280 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
19290 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
192a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
192b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
192c0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
192d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
192e0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
192f0 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
19300 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19310 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
19320 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
19330 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
19340 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
19350 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
19360 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
19370 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19380 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
19390 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
193a0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
193b0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
193c0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
193d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
193e0 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
193f0 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72   & mPrereq)==mPr
19400 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20  ereq );.  *pbIn 
19410 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  = 0;.  pNew->pre
19420 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a  req = mPrereq;..
19430 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61    /* Set the usa
19440 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  ble flag on the 
19450 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72  subset of constr
19460 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64  aints identified
19470 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65   by .  ** argume
19480 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20  nts mUsable and 
19490 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70  mExclude. */.  p
194a0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
194b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
194c0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
194d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
194e0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
194f0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
19500 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
19510 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
19520 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
19530 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d  [pIdxCons->iTerm
19540 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64  Offset];.    pId
19550 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
19560 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  0;.    if( (pTer
19570 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
19580 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d   mUsable)==pTerm
19590 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20  ->prereqRight . 
195a0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
195b0 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c  Operator & mExcl
195c0 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ude)==0.    ){. 
195d0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
195e0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  sable = 1;.    }
195f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
19600 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
19610 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
19620 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
19630 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
19640 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
19650 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
19660 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74  [0])*nConstraint
19670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
19680 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
19690 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20  eIdxStr==0 );.  
196a0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
196b0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
196c0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
196d0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
196e0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
196f0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
19700 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
19710 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
19720 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66  ble)2;.  pIdxInf
19730 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
19740 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66   = 25;.  pIdxInf
19750 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
19760 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c  .  pIdxInfo->col
19770 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  Used = (sqlite3_
19780 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55  int64)pSrc->colU
19790 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  sed;..  /* Invok
197a0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
197b0 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  ble xBestIndex()
197c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20   method */.  rc 
197d0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
197e0 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54  pParse, pSrc->pT
197f0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
19800 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19810 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d   rc;..  mxTerm =
19820 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
19830 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
19840 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
19850 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
19860 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
19870 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
19880 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
19890 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
198a0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
198b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
198c0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
198d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
198e0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
198f0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
19900 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
19910 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
19920 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
19930 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
19940 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
19950 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
19960 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
19970 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
19980 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
19990 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
199a0 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
199b0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
199c0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
199d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
199e0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
199f0 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
19a00 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
19a10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19a20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
19a30 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  OR;.        sqli
19a40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19a50 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65  se,"%s.xBestInde
19a60 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70  x malfunction",p
19a70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
19a80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19a90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
19ab0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
19ac0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
19ad0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
19ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
19af0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
19b00 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
19b10 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
19b20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
19b30 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19b40 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
19b50 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
19b60 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
19b70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
19b80 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
19b90 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
19ba0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
19bb0 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  erm;.      testc
19bc0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
19bd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19be0 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
19bf0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
19c00 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
19c10 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
19c20 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
19c30 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  <<iTerm;.      i
19c40 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
19c50 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
19c60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
19c70 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
19c80 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
19c90 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
19ca0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
19cb0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
19cc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19cd0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
19ce0 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
19cf0 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rms.        ** i
19d00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
19d10 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
19d20 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
19d30 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
19d40 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
19d50 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
19d60 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
19d70 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
19d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65  .        ** toge
19d90 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
19da0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
19db0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
19dc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
19dd0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
19de0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
19df0 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
19e00 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73    *pbIn = 1; ass
19e10 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26  ert( (mExclude &
19e20 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20   WO_IN)==0 );.  
19e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19e40 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
19e50 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73  = mxTerm+1;.  as
19e60 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
19e70 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
19e80 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
19e90 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
19ea0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
19eb0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
19ec0 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
19ed0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19ee0 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
19ef0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19f00 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
19f10 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
19f20 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
19f30 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
19f40 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
19f50 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
19f60 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
19f70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
19f80 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
19f90 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
19fa0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
19fb0 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
19fc0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
19fd0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
19fe0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
19ff0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1a000 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1a010 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1a020 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1a030 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1a040 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1a050 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1a060 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1a070 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1a080 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1a090 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1a0a0 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1a0b0 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1a0c0 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1a0d0 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1a0e0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1a0f0 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1a100 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1a110 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1a120 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1a130 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1a140 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1a150 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1a160 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1a170 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1a180 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1a190 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1a1a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1a1b0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1a1c0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1a1d0 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1a1e0 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1a1f0 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1a200 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a210 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1a220 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1a230 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a250 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1a260 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1a270 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1a280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a290 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
1a2a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
1a2b0 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
1a2c0 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
1a2d0 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
1a2e0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
1a2f0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
1a300 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
1a310 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
1a320 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1a330 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53   no LEFT or CROS
1a340 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20  S JOIN joins in 
1a350 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20  the query, both 
1a360 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d  mPrereq and.** m
1a370 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74  Unusable are set
1a380 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65   to 0. Otherwise
1a390 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d  , mPrereq is a m
1a3a0 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20  ask of all FROM 
1a3b0 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65  clause.** entrie
1a3c0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
1a3d0 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ore the virtual 
1a3e0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1a3f0 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65  M clause and are
1a400 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72  .** separated fr
1a410 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1a420 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52  t one LEFT or CR
1a430 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61  OSS JOIN. Simila
1a440 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75  rly, the.** mUnu
1a450 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61  sable mask conta
1a460 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  ins all FROM cla
1a470 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  use entries that
1a480 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
1a490 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1a4a0 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61  e and are separa
1a4b0 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61  ted from it by a
1a4c0 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54  t least one LEFT
1a4d0 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f   or .** CROSS JO
1a4e0 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  IN. .**.** For e
1a4f0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
1a500 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a  uery were:.**.**
1a510 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20     ... FROM t1, 
1a520 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c  t2 LEFT JOIN t3,
1a530 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f   t4, vt CROSS JO
1a540 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a  IN t5, t6;.**.**
1a550 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f   then mPrereq co
1a560 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31  rresponds to (t1
1a570 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61  , t2) and mUnusa
1a580 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e  ble to (t5, t6).
1a590 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74  .**.** All the t
1a5a0 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71  ables in mPrereq
1a5b0 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1a5c0 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
1a5d0 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20  ent virtual .** 
1a5e0 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65  table. So any te
1a5f0 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c  rms for which al
1a600 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  l prerequisites 
1a610 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
1a620 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79   .** mPrereq may
1a630 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73   be specified as
1a640 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c   "usable" in all
1a650 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1a660 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72  ndex. .** Conver
1a670 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73  sely, all tables
1a680 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75   in mUnusable mu
1a690 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66  st be scanned af
1a6a0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ter the current.
1a6b0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1a6c0 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  , so any terms f
1a6d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65  or which the pre
1a6e0 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c  requisites overl
1a6f0 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73  ap with.** mUnus
1a700 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61  able should alwa
1a710 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64  ys be configured
1a720 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22   as "not-usable"
1a730 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e   for xBestIndex.
1a740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1a750 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1a760 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
1a770 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1a780 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
1a790 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
1a7a0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  /.  Bitmask mPre
1a7b0 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1a7c0 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1a7d0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1a7e0 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20  before this one 
1a7f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
1a800 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20  usable          
1a810 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
1a820 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1a830 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20   after this one 
1a840 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1a850 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1a860 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a870 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ode */.  WhereIn
1a880 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1a890 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
1a8a0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
1a8b0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1a8c0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1a8d0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1a8e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1a8f0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1a900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a910 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1a920 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1a930 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
1a940 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1a950 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1a960 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ch */.  sqlite3_
1a970 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20  index_info *p;  
1a980 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
1a990 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49  o pass to xBestI
1a9a0 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20  ndex() */.  int 
1a9b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1a9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a9d0 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1a9e0 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  s in p */.  int 
1a9f0 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  bIn;            
1aa00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1aa10 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e   if plan uses IN
1aa20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a  (...) operator *
1aa30 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1aa40 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  New;.  Bitmask m
1aa50 42 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Best;           
1aa60 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73      /* Tables us
1aa70 65 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69  ed by best possi
1aa80 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 0a 20 20 61  ble plan */..  a
1aa90 73 73 65 72 74 28 20 28 6d 50 72 65 72 65 71 20  ssert( (mPrereq 
1aaa0 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20  & mUnusable)==0 
1aab0 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  );.  pWInfo = pB
1aac0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1aad0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1aae0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 57 43  o->pParse;.  pWC
1aaf0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1ab00 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1ab10 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
1ab20 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
1ab30 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
1ab40 54 61 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  Tab];.  assert( 
1ab50 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
1ab60 70 54 61 62 29 20 29 3b 0a 20 20 70 20 3d 20 61  pTab) );.  p = a
1ab70 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
1ab80 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55  (pParse, pWC, mU
1ab90 6e 75 73 61 62 6c 65 2c 20 70 53 72 63 2c 20 70  nusable, pSrc, p
1aba0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
1abb0 79 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  y);.  if( p==0 )
1abc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1abd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65  OMEM_BKPT;.  pNe
1abe0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1abf0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1ac00 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1ac10 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
1ac20 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
1ac30 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1ac40 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61   = 0;.  nConstra
1ac50 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72  int = p->nConstr
1ac60 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
1ac70 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72  eLoopResize(pPar
1ac80 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43  se->db, pNew, nC
1ac90 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
1aca0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1acb0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1acc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1acd0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1ace0 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61  }..  /* First ca
1acf0 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  ll xBestIndex() 
1ad00 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1ad10 69 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a  ints usable. */.
1ad20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1ad30 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1ad40 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22  e: all usable\n"
1ad50 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  ));.  rc = where
1ad60 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1ad70 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
1ad80 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c  req, ALLBITS, 0,
1ad90 20 70 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a   p, &bIn);..  /*
1ada0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
1adb0 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74  xBestIndex() wit
1adc0 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62  h all terms enab
1add0 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20 70  led produced a p
1ade0 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f  lan.  ** that do
1adf0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1ae00 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  ny source tables
1ae10 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69   (IOW: a plan wi
1ae20 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20  th mBest==0),.  
1ae30 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
1ae40 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b   no point in mak
1ae50 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72 20  ing any further 
1ae60 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1ae70 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63  dex() .  ** sinc
1ae80 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20  e they will all 
1ae90 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1aea0 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20 78  result (if the x
1aeb0 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a  BestIndex().  **
1aec0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1aed0 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69  is sane). */.  i
1aee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aef0 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e   && (mBest = (pN
1af00 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1af10 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20  rereq))!=0 ){.  
1af20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d    int seenZero =
1af30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1af40 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c 61  /* True if a pla
1af50 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1af60 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  s seen */.    in
1af70 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  t seenZeroNoIN =
1af80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
1af90 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1afa0 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e  eqs and no IN(..
1afb0 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42  .) seen */.    B
1afc0 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30  itmask mPrev = 0
1afd0 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42  ;.    Bitmask mB
1afe0 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20  estNoIn = 0;..  
1aff0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e    /* If the plan
1b000 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65   produced by the
1b010 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73   earlier call us
1b020 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65  es an IN(...) te
1b030 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rm, call.    ** 
1b040 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e  xBestIndex again
1b050 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  , this time with
1b060 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64   IN(...) terms d
1b070 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20  isabled. */.    
1b080 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20  if( bIn ){.     
1b090 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1b0a0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1b0b0 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f  : all usable w/o
1b0c0 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20   IN\n"));.      
1b0d0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b0e0 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1b0f0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41  lder, mPrereq, A
1b100 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70  LLBITS, WO_IN, p
1b110 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61  , &bIn);.      a
1b120 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b  ssert( bIn==0 );
1b130 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e  .      mBestNoIn
1b140 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20   = pNew->prereq 
1b150 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20  & ~mPrereq;.    
1b160 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d    if( mBestNoIn=
1b170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
1b180 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20  enZero = 1;.    
1b190 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e      seenZeroNoIN
1b1a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1b1b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c    }..    /* Call
1b1c0 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65   xBestIndex once
1b1d0 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e   for each distin
1b1e0 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65  ct value of (pre
1b1f0 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1b200 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20  req) .    ** in 
1b210 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73  the set of terms
1b220 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74   that apply to t
1b230 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75  he current virtu
1b240 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
1b250 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1b260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b270 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74  int i;.      Bit
1b280 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c  mask mNext = ALL
1b290 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65  BITS;.      asse
1b2a0 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20  rt( mNext>0 );. 
1b2b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b2c0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1b2d0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
1b2e0 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20  sk mThis = (.   
1b2f0 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b           pWC->a[
1b300 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
1b310 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
1b320 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1b330 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b  rereq.        );
1b340 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 68  .        if( mTh
1b350 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69  is>mPrev && mThi
1b360 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20  s<mNext ) mNext 
1b370 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d  = mThis;.      }
1b380 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d  .      mPrev = m
1b390 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Next;.      if( 
1b3a0 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29  mNext==ALLBITS )
1b3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
1b3c0 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c  ( mNext==mBest |
1b3d0 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f  | mNext==mBestNo
1b3e0 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  In ) continue;. 
1b3f0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1b400 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1b410 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c  lOne: mPrev=%04l
1b420 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c  lx mNext=%04llx\
1b430 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b440 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1b450 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76  te3_uint64)mPrev
1b460 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1b470 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  4)mNext));.     
1b480 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b490 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75  ddVirtualOne(pBu
1b4a0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1b4b0 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30  mNext|mPrereq, 0
1b4c0 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  , p, &bIn);.    
1b4d0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72    if( pNew->prer
1b4e0 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20  eq==mPrereq ){. 
1b4f0 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20         seenZero 
1b500 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
1b510 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1b520 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1b530 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b540 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74  * If the calls t
1b550 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69  o xBestIndex() i
1b560 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70  n the above loop
1b570 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
1b580 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74  plan.    ** that
1b590 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75   requires no sou
1b5a0 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c  rce tables at al
1b5b0 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72  l (i.e. one guar
1b5c0 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20  anteed to be.   
1b5d0 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b   ** usable), mak
1b5e0 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69  e a call here wi
1b5f0 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61  th all source ta
1b600 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  bles disabled */
1b610 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b620 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1b630 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  ro==0 ){.      W
1b640 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1b650 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1b660 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29  all disabled\n")
1b670 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1b680 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1b690 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1b6a0 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1b6b0 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20   0, p, &bIn);.  
1b6c0 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29      if( bIn==0 )
1b6d0 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20   seenZeroNoIN = 
1b6e0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1b6f0 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f   If the calls to
1b700 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 68 61   xBestIndex() ha
1b710 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64  ve so far failed
1b720 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a   to find a plan.
1b730 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75      ** that requ
1b740 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74  ires no source t
1b750 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64  ables at all and
1b760 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e   does not use an
1b770 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20   IN(...).    ** 
1b780 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61  operator, make a
1b790 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f   final call to o
1b7a0 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20  btain one here. 
1b7b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1b7c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65  SQLITE_OK && see
1b7d0 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a  nZeroNoIN==0 ){.
1b7e0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1b7f0 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1b800 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62  alOne: all disab
1b810 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e  led and w/o IN\n
1b820 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1b830 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1b840 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1b850 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65   mPrereq, mPrere
1b860 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 26 62 49  q, WO_IN, p, &bI
1b870 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
1b880 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72   if( p->needToFr
1b890 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
1b8a0 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74  e3_free(p->idxSt
1b8b0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
1b8c0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1b8d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b8e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b8f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1b900 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1b910 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1b920 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1b930 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1b940 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1b950 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1b960 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1b970 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1b980 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1b990 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1b9a0 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1b9b0 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1b9c0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1b9d0 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1b9e0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1b9f0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1ba00 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1ba10 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1ba20 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1ba30 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1ba40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1ba50 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1ba60 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1ba70 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1ba80 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1ba90 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1baa0 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1bab0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1bac0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1bad0 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1bae0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1baf0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1bb00 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1bb10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bb20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1bb30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1bb40 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1bb50 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1bb60 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1bb70 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1bb80 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1bb90 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1bba0 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1bbb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1bbc0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1bbd0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1bbe0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1bbf0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1bc00 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1bc10 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1bc20 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1bc30 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1bc40 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1bc50 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1bc60 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1bc70 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1bc80 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1bc90 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1bca0 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1bcb0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1bcc0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1bcd0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1bce0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1bcf0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1bd00 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1bd10 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1bd20 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1bd30 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1bd40 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1bd50 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1bd60 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1bd70 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1bd80 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1bd90 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1bda0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1bdb0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1bdc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1bdd0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1bde0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1bdf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1be00 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1be10 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1be20 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1be30 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1be40 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1be50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1be60 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1be70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1be80 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1be90 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1bea0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1beb0 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1bec0 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1bed0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1bee0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1bef0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1bf00 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1bf10 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1bf20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1bf30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1bf40 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1bf50 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1bf60 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1bf70 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1bf80 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1bf90 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1bfa0 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1bfb0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1bfc0 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1bfd0 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1bfe0 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1bff0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1c000 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1c010 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1c020 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1c030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75    for(i=0; i<sSu
1c040 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
1c050 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
1c060 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
1c070 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70  int(&sSubBuild.p
1c080 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
1c090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c0a0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1c0b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1c0c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1c0d0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1c0e0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1c0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1c100 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1c110 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1c120 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1c130 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1c140 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1c150 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1c160 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1c170 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1c180 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1c190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c1a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c1b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c1c0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1c1d0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1c1e0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1c1f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c200 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1c210 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1c220 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1c230 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1c240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1c250 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1c260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c270 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1c280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1c290 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1c2a0 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1c2b0 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1c2c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c2d0 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1c2e0 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1c2f0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1c300 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1c310 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1c320 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1c330 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1c340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1c350 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1c360 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1c370 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1c380 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1c390 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1c3a0 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1c3b0 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1c3e0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1c3f0 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1c400 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c420 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1c430 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1c440 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1c450 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1c460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1c470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c480 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1c490 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1c4a0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1c4b0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1c4c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1c4d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1c4e0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1c4f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1c500 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1c510 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1c520 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1c530 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1c540 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1c550 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1c560 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1c570 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1c580 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1c590 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1c5a0 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1c5b0 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1c5c0 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1c5d0 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1c5e0 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1c5f0 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1c600 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1c610 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1c620 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1c630 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1c640 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1c650 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1c660 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1c670 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1c680 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1c690 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1c6a0 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1c6b0 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1c6c0 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1c6d0 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1c6e0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1c6f0 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1c700 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1c710 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1c720 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1c730 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1c740 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1c750 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1c760 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1c770 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1c780 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1c790 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1c7a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1c7b0 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1c7c0 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1c7d0 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1c7e0 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1c7f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1c800 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1c810 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1c820 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1c830 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1c840 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1c850 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1c860 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1c870 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1c880 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1c890 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1c8a0 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1c8b0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1c8c0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1c8d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c8e0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1c8f0 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1c900 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1c910 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1c920 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c930 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1c940 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1c950 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1c960 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1c970 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1c980 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1c990 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1c9a0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1c9b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1c9c0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1c9d0 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
1c9e0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1c9f0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1ca00 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1ca10 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1ca20 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1ca30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ca40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1ca50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ca60 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1ca70 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1ca80 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1ca90 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1caa0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1cab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cac0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1cad0 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1cae0 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1caf0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1cb00 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1cb10 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1cb20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1cb30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1cb40 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1cb50 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1cb60 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1cb70 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1cb80 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1cb90 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1cba0 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1cbb0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1cbc0 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1cbd0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1cbe0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1cbf0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1cc00 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1cc10 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1cc20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1cc30 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1cc40 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1cc50 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1cc60 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1cc70 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1cc80 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1cc90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1cca0 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1ccb0 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1ccc0 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1ccd0 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1cce0 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
1ccf0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1cd00 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1cd10 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1cd20 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
1cd30 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1cd40 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ab) ){.      str
1cd50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cd60 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
1cd70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45  =&pItem[1]; p<pE
1cd80 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
1cd90 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20    if( mUnusable 
1cda0 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79  || (p->fg.jointy
1cdb0 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1cdc0 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20  _CROSS)) ){.    
1cdd0 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20        mUnusable 
1cde0 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47  |= sqlite3WhereG
1cdf0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1ce00 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75  sMaskSet, p->iCu
1ce10 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
1ce20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ce30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1ce40 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
1ce50 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1ce60 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
1ce70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1ce80 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
1ce90 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1cea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ceb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1ced0 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1cee0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1cef0 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1cf00 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1cf10 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1cf20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1cf30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1cf40 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1cf50 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1cf60 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1cf70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1cf80 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1cf90 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1cfa0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1cfb0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1cfc0 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
1cfd0 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1cfe0 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1cff0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1d000 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1d010 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1d020 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1d030 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1d040 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1d050 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1d060 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1d070 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1d080 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1d090 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1d0a0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1d0b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1d0c0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1d0d0 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1d0e0 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
1d0f0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
1d100 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
1d110 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
1d120 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
1d130 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
1d140 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
1d150 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
1d160 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
1d170 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1d180 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
1d190 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
1d1a0 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
1d1b0 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
1d1c0 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
1d1d0 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
1d1e0 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
1d1f0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
1d200 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
1d210 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
1d220 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
1d230 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
1d240 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1d250 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1d260 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
1d270 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1d280 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
1d290 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
1d2a0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
1d2b0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
1d2c0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
1d2d0 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
1d2e0 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
1d2f0 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
1d300 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
1d310 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
1d320 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1d330 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
1d340 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
1d350 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1d360 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1d370 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
1d380 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
1d390 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
1d3a0 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
1d3b0 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
1d3c0 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
1d3d0 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
1d3e0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
1d3f0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1d400 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74     /* Might cont
1d410 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42  ain WHERE_GROUPB
1d420 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49  Y or WHERE_DISTI
1d430 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e  NCTBY */.  u16 n
1d440 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
1d450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1d460 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
1d470 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65  aLoop[] */.  Whe
1d480 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
1d490 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
1d4a0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
1d4b0 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
1d4c0 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
1d4d0 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
1d4e0 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
1d4f0 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
1d500 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
1d510 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
1d520 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
1d530 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
1d540 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
1d550 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
1d560 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
1d570 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
1d580 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
1d590 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d5a0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1d5b0 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
1d5c0 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
1d5d0 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
1d5e0 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
1d5f0 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
1d600 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
1d610 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
1d620 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
1d630 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
1d640 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
1d650 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
1d660 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
1d670 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
1d680 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
1d690 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  6 nKeyCol;      
1d6a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d6b0 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
1d6c0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
1d6d0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
1d6e0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1d6f0 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c  r of ordered col
1d700 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
1d710 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
1d720 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
1d730 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
1d740 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1d750 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
1d760 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
1d770 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
1d780 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
1d790 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
1d7a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1d7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1d7c0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1d7d0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1d7e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1d7f0 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
1d800 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
1d810 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1d820 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
1d830 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
1d840 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
1d850 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1d860 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
1d870 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
1d880 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
1d890 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1d8a0 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
1d8b0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
1d8c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1d8d0 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
1d8e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
1d8f0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
1d900 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1d910 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
1d920 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
1d930 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
1d940 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
1d950 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
1d960 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1d970 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1d980 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1d990 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
1d9a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d9b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1d9c0 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
1d9d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1d9e0 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
1d9f0 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
1da00 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1da10 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
1da20 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1da30 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
1da40 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
1da50 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
1da60 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
1da70 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
1da80 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
1da90 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
1daa0 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dac0 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
1dad0 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
1dae0 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1daf0 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
1db00 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
1db10 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
1db20 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
1db30 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
1db40 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
1db50 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
1db60 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1db70 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
1db80 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
1db90 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
1dba0 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
1dbb0 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
1dbc0 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
1dbd0 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
1dbe0 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
1dbf0 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
1dc00 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
1dc10 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
1dc20 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
1dc30 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
1dc40 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1dc50 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
1dc60 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
1dc70 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1dc80 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
1dc90 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
1dca0 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
1dcb0 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
1dcc0 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
1dcd0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1dce0 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
1dcf0 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
1dd00 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
1dd10 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
1dd20 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1dd30 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
1dd40 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
1dd50 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
1dd60 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
1dd70 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
1dd80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1dd90 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
1dda0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
1ddb0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1ddc0 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
1ddd0 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
1dde0 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
1ddf0 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
1de00 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
1de10 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
1de20 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
1de30 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
1de40 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
1de50 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
1de60 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
1de70 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
1de80 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
1de90 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
1dea0 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
1deb0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
1dec0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
1ded0 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
1dee0 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
1def0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
1df00 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
1df10 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
1df20 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1df30 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
1df40 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
1df50 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
1df60 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
1df70 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
1df80 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1df90 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c  y!=0 );.  if( nL
1dfa0 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
1dfb0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1dfc0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1dfd0 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
1dfe0 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
1dff0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1e000 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
1e010 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
1e020 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
1e030 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
1e040 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
1e050 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
1e060 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
1e070 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1e080 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
1e090 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
1e0a0 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
1e0b0 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
1e0c0 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
1e0d0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
1e0e0 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
1e0f0 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
1e100 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
1e110 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
1e120 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
1e130 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
1e140 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
1e150 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
1e160 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
1e170 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66   : pLast;.    if
1e180 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1e190 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1e1a0 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
1e1b0 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
1e1c0 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
1e1d0 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
1e1e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e1f0 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
1e200 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1e210 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
1e220 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
1e230 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
1e240 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
1e250 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
1e260 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
1e270 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
1e280 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
1e290 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
1e2a0 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
1e2b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
1e2c0 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
1e2d0 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
1e2e0 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
1e2f0 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
1e300 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1e310 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1e320 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
1e330 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1e340 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e350 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1e360 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1e370 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1e380 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
1e390 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1e3a0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
1e3b0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
1e3c0 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1e3d0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1e3e0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
1e3f0 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
1e400 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
1e410 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
1e420 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
1e450 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20  O_ISNULL|WO_IS, 
1e460 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
1e470 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1e480 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
1e490 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
1e4a0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
1e4b0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
1e4c0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
1e4d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e4e0 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
1e4f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1e500 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1e510 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
1e520 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1e530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1e540 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1e550 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1e560 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
1e570 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1e580 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1e590 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
1e5a0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
1e5b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1e5c0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1e5d0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1e5e0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
1e5f0 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
1e600 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1e610 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1e620 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
1e630 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
1e640 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
1e650 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1e660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
1e670 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e680 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
1e690 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e6a0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1e6b0 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
1e6c0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1e6d0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
1e6e0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
1e6f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
1e700 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
1e710 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
1e720 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1e730 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
1e740 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
1e750 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
1e760 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
1e770 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e790 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
1e7a0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
1e7b0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
1e7c0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1e7d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e7e0 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
1e7f0 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
1e800 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1e810 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1e820 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
1e830 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
1e840 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20  =XN_ROWID.      
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1e870 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1e880 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
1e890 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55  erDistinct = IsU
1e8a0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1e8b0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
1e8c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
1e8d0 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
1e8e0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
1e8f0 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
1e900 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
1e910 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
1e920 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
1e930 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e940 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
1e950 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
1e960 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
1e970 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1e980 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
1e990 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20        u8 bOnce; 
1e9a0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e    /* True to run
1e9b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
1e9c0 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
1e9d0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
1e9e0 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c  er == and IS NUL
1e9f0 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  L terms */.     
1ea00 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
1ea10 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
1ea20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e       && pLoop->n
1ea30 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20  Skip==0.        
1ea40 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d   && ((i = pLoop-
1ea50 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
1ea60 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c  rator) & (WO_EQ|
1ea70 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
1ea80 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
1ea90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
1eaa0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
1eab0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1eac0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
1ead0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
1eae0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1eaf0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1eb00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
1eb10 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
1eb20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1eb30 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
1eb40 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
1eb50 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
1eb60 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
1eb70 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
1eb80 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
1eb90 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1eba0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
1ebb0 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
1ebc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
1ebd0 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
1ebe0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1ebf0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1ec00 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1ec10 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
1ec20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
1ec30 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
1ec40 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
1ec50 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1ec60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
1ec70 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
1ec80 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
1ec90 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
1eca0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
1ecb0 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
1ecc0 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
1ecd0 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
1ece0 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
1ecf0 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
1ed00 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
1ed10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ed20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1ed30 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
1ed40 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
1ed50 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
1ed60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1ed70 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
1ed80 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
1ed90 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1eda0 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
1edb0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
1edc0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1edd0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1ede0 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
1edf0 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
1ee00 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1ee10 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1ee20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1ee30 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
1ee40 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
1ee50 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
1ee60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
1ee70 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
1ee80 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
1ee90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
1eea0 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
1eeb0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
1eec0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1eed0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1eee0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1eef0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1ef00 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1ef10 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1ef20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1ef30 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1ef40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1ef50 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
1ef60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
1ef70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1ef80 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
1ef90 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
1efa0 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
1efb0 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
1efc0 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
1efd0 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
1efe0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1eff0 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  mn>=(-1) ){.    
1f000 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
1f010 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1f020 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1f030 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1f040 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1f050 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1f060 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f070 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1f080 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
1f090 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1f0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f0b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1f0c0 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78  xprCompare(pOBEx
1f0d0 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  pr,pIndex->aColE
1f0e0 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  xpr->a[j].pExpr,
1f0f0 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
1f100 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1f110 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f130 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
1f140 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1f150 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1f160 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1f170 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
1f180 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1f190 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1f1a0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
1f1b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
1f1c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
1f1d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1f1e0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
1f1f0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
1f200 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
1f210 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1f220 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
1f230 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
1f240 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1f250 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
1f260 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
1f270 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
1f280 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
1f290 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
1f2a0 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
1f2b0 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
1f2c0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
1f2d0 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
1f2e0 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
1f2f0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
1f300 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
1f310 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1f320 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
1f330 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1f340 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
1f350 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1f360 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
1f370 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
1f380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f390 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
1f3a0 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
1f3b0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
1f3c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
1f3d0 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
1f3e0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
1f400 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
1f410 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f420 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1f430 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
1f440 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
1f450 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1f460 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
1f470 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
1f480 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
1f490 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
1f4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f4b0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1f4c0 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
1f4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f4e0 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
1f4f0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
1f500 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
1f510 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1f520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1f530 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
1f540 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1f550 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1f560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1f570 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
1f580 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1f590 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
1f5a0 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
1f5b0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
1f5c0 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
1f5d0 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
1f5e0 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
1f5f0 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
1f600 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1f610 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
1f620 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
1f630 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
1f640 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
1f650 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
1f660 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
1f670 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
1f680 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
1f690 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
1f6a0 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
1f6b0 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
1f6c0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1f6d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
1f6e0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
1f6f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
1f700 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
1f710 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
1f720 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
1f730 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
1f740 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
1f750 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1f760 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
1f770 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
1f780 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
1f790 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
1f7a0 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
1f7b0 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
1f7c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
1f7d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f7e0 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
1f7f0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
1f800 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1f810 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1f820 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
1f830 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1f840 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
1f850 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
1f860 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
1f870 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
1f880 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
1f890 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
1f8a0 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
1f8b0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
1f8c0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
1f8d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
1f8e0 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
1f8f0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
1f900 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
1f910 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
1f920 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
1f930 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
1f940 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f950 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1f960 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
1f970 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
1f980 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
1f990 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
1f9a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1f9b0 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
1f9c0 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
1f9d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
1f9e0 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
1f9f0 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
1fa00 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
1fa10 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
1fa20 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
1fa30 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
1fa40 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
1fa50 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
1fa60 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
1fa70 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
1fa80 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
1fa90 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
1faa0 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
1fab0 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
1fac0 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
1fad0 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
1fae0 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
1faf0 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
1fb00 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
1fb10 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
1fb20 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
1fb30 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
1fb40 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
1fb50 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
1fb60 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1fb70 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
1fb80 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
1fb90 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
1fba0 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
1fbb0 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
1fbc0 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
1fbd0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
1fbe0 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
1fbf0 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
1fc00 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
1fc10 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
1fc20 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
1fc30 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
1fc40 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
1fc50 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1fc60 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
1fc70 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
1fc80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1fc90 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
1fca0 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
1fcb0 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
1fcc0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1fcd0 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
1fce0 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
1fcf0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
1fd00 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
1fd10 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
1fd20 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
1fd30 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
1fd40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1fd50 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
1fd60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
1fd70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1fd80 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
1fd90 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
1fda0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
1fdb0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
1fdc0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
1fdd0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
1fde0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
1fdf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
1fe00 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
1fe10 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
1fe20 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
1fe30 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
1fe40 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
1fe50 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
1fe60 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
1fe70 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
1fe80 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
1fe90 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
1fea0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
1feb0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
1fec0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
1fed0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
1fee0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1fef0 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
1ff00 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
1ff10 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
1ff20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
1ff30 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
1ff40 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
1ff50 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
1ff60 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
1ff70 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
1ff80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
1ff90 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
1ffa0 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
1ffb0 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
1ffc0 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
1ffd0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
1ffe0 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
1fff0 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
20000 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
20010 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
20020 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
20030 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
20040 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
20050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
20060 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
20070 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
20080 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
20090 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
200a0 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
200b0 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
200c0 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
200d0 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
200e0 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
200f0 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
20100 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
20110 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
20120 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
20130 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
20140 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
20150 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
20160 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
20170 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
20180 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
20190 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
201a0 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
201b0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
201c0 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
201d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
201e0 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
201f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
20200 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
20210 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
20220 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
20230 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
20240 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
20250 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
20260 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
20270 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
20280 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
20290 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
202a0 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
202b0 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
202c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
202d0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
202e0 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
202f0 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
20300 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
20310 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
20320 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
20330 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
20340 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
20350 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
20360 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
20370 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
20380 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
20390 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
203a0 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
203b0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
203c0 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
203d0 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
203e0 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
203f0 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
20400 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
20410 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
20420 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
20430 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
20440 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
20450 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
20460 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
20470 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
20480 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
20490 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
204a0 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
204b0 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
204c0 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
204d0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
204e0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
204f0 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
20500 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
20510 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
20520 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
20530 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
20540 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
20550 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
20560 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
20570 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
20580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20590 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
205a0 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
205b0 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
205c0 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
205d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
205e0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
205f0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
20600 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
20610 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
20620 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
20630 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
20640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20650 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
20660 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
20670 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
20680 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20690 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
206a0 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
206b0 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
206e0 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
206f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20700 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
20710 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
20720 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
20730 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
20740 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
20750 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
20760 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
20770 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
20780 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
20790 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
207a0 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
207b0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
207c0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
207d0 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
207e0 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
207f0 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
20800 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
20810 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
20820 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
20830 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
20840 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
20850 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
20860 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
20870 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
20880 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
20890 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
208a0 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
208b0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
208c0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
208d0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
208e0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
208f0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
20900 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
20910 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
20920 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
20930 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
20940 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
20950 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
20960 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
20970 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
20980 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
20990 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
209a0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
209b0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
209c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
209d0 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
209e0 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
209f0 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
20a00 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
20a10 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
20a20 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
20a30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
20a40 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
20a50 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
20a60 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
20a70 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
20a80 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
20a90 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
20aa0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
20ab0 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
20ac0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
20ad0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
20ae0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20af0 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
20b00 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
20b10 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
20b20 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
20b30 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
20b40 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
20b50 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
20b60 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
20b70 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
20b80 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
20b90 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
20ba0 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
20bb0 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
20bc0 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
20bd0 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
20be0 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
20bf0 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
20c00 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
20c10 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
20c20 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
20c30 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
20c40 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
20c50 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
20c60 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
20c70 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
20c80 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
20c90 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
20ca0 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
20cb0 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
20cc0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
20cd0 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
20ce0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20cf0 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
20d00 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
20d10 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
20d20 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
20d30 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
20d40 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
20d50 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
20d60 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
20d70 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
20d80 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
20d90 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
20da0 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
20db0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
20dc0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
20dd0 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
20de0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
20df0 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
20e00 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
20e10 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
20e20 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20e30 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
20e40 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
20e50 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
20e60 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
20e70 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
20e80 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
20e90 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
20ea0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
20eb0 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
20ec0 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
20ed0 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
20ee0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
20ef0 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
20f00 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
20f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20f20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
20f30 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
20f40 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
20f50 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
20f60 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
20f70 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
20f80 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
20f90 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
20fa0 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
20fb0 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
20fc0 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
20fd0 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
20fe0 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
20ff0 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
21000 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
21010 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
21020 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
21030 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21040 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
21050 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
21060 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
21070 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
21080 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
21090 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
210a0 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
210b0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
210c0 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
210d0 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
210e0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
210f0 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
21100 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
21110 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
21120 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
21130 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
21140 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
21150 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
21160 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
21170 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
21180 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
21190 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
211a0 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
211b0 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
211c0 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
211d0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
211e0 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
211f0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
21200 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
21210 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
21220 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
21230 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
21240 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
21250 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
21260 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
21270 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
21280 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
21290 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
212a0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
212b0 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
212c0 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
212d0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
212e0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
212f0 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
21300 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
21310 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
21320 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
21330 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
21340 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
21350 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
21360 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
21370 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
21380 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
21390 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
213a0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
213b0 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
213c0 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
213d0 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
213e0 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
213f0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
21400 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
21410 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
21420 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
21430 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
21440 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
21450 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
21460 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
21470 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
21480 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
21490 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
214a0 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
214b0 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
214c0 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
214d0 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
214e0 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
214f0 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
21500 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
21510 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
21520 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
21530 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
21540 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
21550 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
21560 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
21570 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
21580 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
21590 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
215a0 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
215b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
215c0 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
215d0 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
215e0 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
215f0 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
21600 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
21610 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
21620 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
21630 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
21640 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
21650 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
21660 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
21670 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
21680 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
21690 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
216a0 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
216b0 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
216c0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
216d0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
216e0 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
216f0 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
21700 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
21710 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
21720 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
21730 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
21740 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
21750 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
21760 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
21770 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21790 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
217a0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
217b0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
217c0 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
217d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
217e0 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
217f0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
21800 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
21810 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
21820 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
21830 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
21840 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
21850 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
21860 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
21870 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
21880 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
21890 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
218a0 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
218b0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
218c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
218d0 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
218e0 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
218f0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
21900 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21910 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
21920 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
21930 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
21940 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
21950 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
21960 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
21970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21980 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
21990 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
219a0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
219b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
219c0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
219d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
219e0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
219f0 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b  From->nRow<10 ){
21a00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
21a10 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
21a20 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
21a30 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
21a40 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
21a50 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
21a60 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20  s than 2 times. 
21a70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
21a80 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
21a90 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
21aa0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21ac0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
21ad0 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
21ae0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
21af0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
21b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
21b10 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
21b20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
21b30 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
21b40 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
21b50 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
21b60 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
21b70 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
21b80 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
21b90 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
21ba0 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
21bb0 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
21bc0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
21bd0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
21be0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
21bf0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
21c00 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
21c10 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
21c20 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
21c30 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21c40 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
21c50 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
21c60 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21c80 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
21c90 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
21ca0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
21cd0 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
21ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21cf0 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
21d00 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
21d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21d20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
21d30 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
21d40 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
21d50 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
21d60 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
21d70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21d80 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
21d90 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
21da0 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
21db0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
21dc0 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
21dd0 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
21de0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
21df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21e00 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
21e10 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
21e20 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
21e30 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
21e40 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
21e50 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
21e60 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
21e70 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
21e80 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
21e90 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
21ea0 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
21eb0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
21ec0 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
21ed0 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
21ee0 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
21f00 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
21f10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21f20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
21f30 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
21f40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
21f50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21f60 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
21f70 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
21f80 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
21f90 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
21fa0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
21fb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
21fc0 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
21fd0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
21fe0 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
21ff0 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
22000 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
22010 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
22020 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
22030 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
22040 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
22050 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
22060 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
22070 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
22080 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
22090 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
220a0 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
220b0 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
220c0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
220d0 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
220e0 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
220f0 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
22100 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
22110 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
22120 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
22130 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
22140 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
22150 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
22160 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
22170 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
22180 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
22190 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
221a0 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
221b0 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
221c0 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
221d0 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
221e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
221f0 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
22200 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
22210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22230 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
22240 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
22250 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
22260 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
22270 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
22280 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
22290 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
222a0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
222b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
222c0 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
222d0 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
222e0 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
222f0 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
22300 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22310 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
22320 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
22330 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
22340 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
22350 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
22360 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
22370 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
22380 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
22390 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
223a0 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
223b0 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
223c0 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
223d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
223e0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
223f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22400 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
22410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22420 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22430 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
22440 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
22450 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
22460 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
22470 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
22480 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
22490 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
224c0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
224d0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
224e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
224f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22510 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
22520 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
22530 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
22540 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
22550 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
22560 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
22570 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
22580 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
22590 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
225a0 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
225b0 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
225c0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
225d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
225e0 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
225f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
22600 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
22610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22620 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
22630 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
22640 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
22650 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
22660 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
22670 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
22680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22690 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
226a0 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
226b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
226c0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
226d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
226e0 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
226f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22700 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22710 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
22720 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
22730 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
22740 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
22750 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
22760 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
22770 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
22780 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
22790 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
227a0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
227b0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
227c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
227d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
227e0 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
227f0 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
22800 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
22810 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
22820 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
22830 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
22840 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72  has the sam isOr
22850 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
22860 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
22870 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
22880 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
22890 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
228a0 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
228b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
228c0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
228d0 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
228e0 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
228f0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
22900 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f  st<rCost || (pTo
22910 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26  ->rCost==rCost &
22920 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
22930 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  t) ){.#ifdef WHE
22940 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
22950 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
22960 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22970 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
22980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22990 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
229a0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
229b0 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
229c0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
229d0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
229f0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
22a00 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
22a10 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
22a40 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
22a50 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
22a60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22a70 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
22a80 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
22a90 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
22ab0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
22ac0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
22ad0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
22ae0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
22af0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
22b00 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
22b10 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
22b20 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
22b30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22b40 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
22b50 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
22b60 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
22b70 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
22b80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
22b90 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
22ba0 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
22bb0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22bc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
22bd0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
22be0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
22bf0 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
22c00 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
22c10 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
22c20 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
22c30 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
22c40 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
22c50 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
22c60 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
22c70 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
22c80 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
22c90 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
22ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22cb0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
22cc0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
22cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
22ce0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
22cf0 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
22d00 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
22d10 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
22d30 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
22d40 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
22d50 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
22d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d70 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
22d80 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
22d90 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
22da0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22db0 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
22dc0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
22dd0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
22de0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
22df0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
22e00 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
22e10 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
22e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e30 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
22e40 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
22e50 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
22e60 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
22e70 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
22e80 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
22e90 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
22ea0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
22eb0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
22ec0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
22ed0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
22ee0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
22ef0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
22f00 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
22f10 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
22f20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
22f30 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
22f40 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
22f50 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
22f60 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
22f70 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
22f80 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
22f90 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
22fa0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
22fb0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
22fc0 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
22fd0 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
22fe0 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
22ff0 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
23000 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
23010 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
23020 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
23030 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
23040 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
23050 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
23060 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
23070 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
23080 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
23090 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
230a0 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
230b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
230c0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
230d0 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
230e0 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
230f0 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
23100 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
23110 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
23120 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23130 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
23140 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
23150 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
23160 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
23170 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
23180 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
23190 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
231a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
231b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
231c0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
231d0 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
231e0 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
231f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
23200 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
23210 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23220 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
23230 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
23240 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
23250 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
23260 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
23270 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
23280 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23290 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
232a0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
232b0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
232c0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
232d0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
232e0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
232f0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
23300 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
23310 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
23320 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
23330 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
23340 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
23350 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
23360 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23370 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
23380 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
23390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
233a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
233b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
233c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
233d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
233e0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
233f0 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
23400 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
23410 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
23420 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
23430 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
23440 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
23450 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
23460 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
23470 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
23480 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
234a0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
234b0 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
234c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
234d0 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
234e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
234f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
23500 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
23510 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
23520 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
23530 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
23540 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
23550 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
23560 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
23570 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
23580 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
23590 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
235a0 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
235b0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
235c0 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
235d0 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
235e0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
235f0 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
23600 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
23610 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
23620 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
23630 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
23640 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
23650 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
23660 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
23670 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
23680 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
23690 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
236a0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
236b0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
236c0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
236d0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
236e0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
236f0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
23700 70 44 69 73 74 69 6e 63 74 53 65 74 20 7c 7c 20  pDistinctSet || 
23710 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
23720 61 67 73 26 57 48 45 52 45 5f 57 41 4e 54 5f 44  ags&WHERE_WANT_D
23730 49 53 54 49 4e 43 54 29 3d 3d 30 20 29 3b 0a 20  ISTINCT)==0 );. 
23740 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
23750 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23760 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
23770 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
23780 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23790 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
237a0 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
237b0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
237c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
237d0 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
237e0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
237f0 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
23800 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
23810 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
23820 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
23830 70 44 69 73 74 69 6e 63 74 53 65 74 2c 20 70 46  pDistinctSet, pF
23840 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
23850 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
23860 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
23870 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
23880 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
23890 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
238a0 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74  WInfo->pDistinct
238b0 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
238c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
238d0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
238e0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
238f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
23900 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
23910 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
23920 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23930 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
23940 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
23950 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
23960 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
23970 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
23980 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
23990 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
239a0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
239b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
239c0 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
239d0 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
239e0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
239f0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
23a00 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d  BSat<0 ) pWInfo-
23a10 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
23a20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
23a30 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
23a40 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oop;.    }.    i
23a50 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23a60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
23a70 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
23a80 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
23a90 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
23aa0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
23ab0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
23ac0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
23ad0 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
23ae0 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
23af0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
23b00 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
23b10 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
23b20 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
23b30 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
23b40 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
23b50 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
23b60 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
23b70 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
23b80 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
23b90 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
23ba0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
23bb0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
23bc0 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
23bd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
23be0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
23bf0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
23c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
23c10 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
23c20 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
23c30 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
23c40 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
23c50 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
23c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23c70 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
23c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
23ca0 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
23cb0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
23cc0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
23cd0 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
23ce0 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
23cf0 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
23d00 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
23d10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
23d20 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
23d30 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
23d40 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
23d50 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
23d60 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
23d70 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
23d80 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
23d90 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
23da0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
23db0 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
23dc0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
23dd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
23de0 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
23df0 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
23e00 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
23e10 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
23e20 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
23e30 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
23e40 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
23e50 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
23e60 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
23e70 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
23e80 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
23e90 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
23ea0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
23eb0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
23ec0 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
23ed0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23ee0 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
23ef0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
23f00 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
23f10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
23f20 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
23f30 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
23f40 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
23f50 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20  pIdx;..  pWInfo 
23f60 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
23f70 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
23f80 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23f90 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
23fa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
23fb0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
23fc0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
23fd0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
23fe0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23ff0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
24000 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
24010 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
24020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
24030 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
24040 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20  exedBy ) return 
24050 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
24060 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
24070 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
24080 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
24090 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
240a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
240b0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
240c0 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
240d0 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
240e0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
240f0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
24100 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IS, 0);.  if( pT
24110 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63  erm ){.    testc
24120 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
24130 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
24140 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
24150 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
24160 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
24170 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
24180 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
24190 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
241a0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
241b0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
241c0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
241d0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
241e0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
241f0 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
24200 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
24210 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
24220 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
24230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
24240 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
24250 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
24260 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
24270 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a      int opMask;.
24280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
24290 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
242a0 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
242b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  );.      if( !Is
242c0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
242d0 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  ).       || pIdx
242e0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
242f0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
24300 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
24310 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
24320 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
24330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24340 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78     opMask = pIdx
24350 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
24360 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20  (WO_EQ|WO_IS) : 
24370 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72  WO_EQ;.      for
24380 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
24390 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
243a0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
243b0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
243c0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
243d0 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29  0, opMask, pIdx)
243e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
243f0 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
24400 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24410 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24420 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
24430 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
24440 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
24450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24460 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
24470 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
24480 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
24490 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
244a0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
244b0 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
244c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
244d0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
244e0 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
244f0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
24500 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
24510 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
24520 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
24530 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
24540 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
24550 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
24560 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
24570 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
24580 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
24590 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
245a0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
245b0 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
245c0 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
245d0 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
245e0 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
245f0 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
24600 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
24610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
24620 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
24630 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
24640 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
24650 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
24660 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
24670 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
24680 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
24690 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
246a0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
246b0 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
246c0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
246d0 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
246e0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
246f0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
24700 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
24710 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
24720 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
24730 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
24740 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
24750 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
24760 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
24770 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
24780 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
24790 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
247a0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
247b0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
247c0 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
247d0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
247e0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
247f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
24800 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
24810 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
24820 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
24830 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
24840 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
24850 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
24860 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
24870 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
24880 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
24890 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
248a0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
248b0 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
248c0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
248d0 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
248e0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
248f0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
24900 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
24910 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
24920 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
24930 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
24940 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
24950 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
24960 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
24970 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
24980 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
24990 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
249a0 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
249b0 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
249c0 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
249d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
249e0 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
249f0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
24a00 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
24a10 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
24a20 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
24a30 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
24a40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
24a50 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
24a60 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
24a70 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
24a80 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
24a90 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
24aa0 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
24ab0 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
24ac0 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
24ad0 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
24ae0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
24af0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
24b00 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
24b10 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
24b20 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
24b30 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
24b40 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
24b50 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
24b60 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
24b70 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
24b80 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
24b90 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
24ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
24bd0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
24be0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
24c00 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
24c10 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
24c20 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
24c30 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
24c40 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
24c50 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
24c60 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
24c70 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
24c80 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
24c90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24ca0 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
24cb0 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
24cc0 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
24cd0 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
24ce0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
24cf0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
24d00 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
24d10 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
24d20 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
24d30 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
24d40 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
24d50 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
24d60 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
24d70 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
24d80 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
24d90 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
24da0 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
24db0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
24dc0 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
24dd0 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
24de0 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
24df0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
24e00 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
24e10 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
24e20 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
24e30 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
24e40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
24e50 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
24e60 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
24e70 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
24e80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
24e90 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
24ea0 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
24eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
24ec0 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
24ed0 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
24ee0 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
24ef0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
24f00 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
24f10 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
24f20 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
24f30 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
24f40 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
24f50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
24f60 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
24f70 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
24f80 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
24f90 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
24fa0 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
24fb0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
24fc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24fd0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
24fe0 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
24ff0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
25000 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
25010 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
25020 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
25030 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
25040 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
25050 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
25060 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
25070 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
25080 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
25090 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
250a0 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
250b0 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
250c0 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
250d0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
250e0 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
250f0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
25100 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
25110 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
25120 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
25130 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
25140 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
25150 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
25160 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
25170 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
25180 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
25190 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
251a0 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
251b0 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
251c0 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
251d0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
251e0 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
251f0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
25200 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
25210 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
25220 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
25230 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
25240 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
25250 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
25260 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
25270 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
25280 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
25290 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
252a0 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
252b0 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
252c0 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
252d0 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
252e0 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
252f0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
25300 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
25310 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
25320 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
25330 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
25340 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
25350 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
25360 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
25370 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
25380 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
25390 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
253a0 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
253b0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
253c0 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
253d0 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
253e0 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
253f0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
25400 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
25410 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
25420 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
25430 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
25440 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
25450 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
25460 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
25470 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
25480 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
25490 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
254a0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
254b0 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
254c0 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
254d0 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
254e0 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
254f0 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
25500 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
25510 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
25520 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
25530 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
25540 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
25550 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
25560 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
25570 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
25580 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
25590 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
255a0 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
255b0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
255c0 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
255d0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
255e0 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
255f0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
25600 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
25610 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
25620 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
25630 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
25640 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
25650 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
25660 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
25670 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
25680 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
25690 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
256a0 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
256b0 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
256c0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
256d0 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
256e0 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
256f0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
25700 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
25710 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
25720 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
25730 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
25740 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
25750 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
25760 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
25780 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
25790 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
257a0 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  ist,      /* FRO
257b0 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
257c0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
257d0 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
257e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
257f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25800 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
25810 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
25820 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e  derBy,     /* An
25830 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
25840 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
25850 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
25860 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
25870 53 65 74 2c 20 2f 2a 20 54 72 79 20 6e 6f 74 20  Set, /* Try not 
25880 74 6f 20 6f 75 74 70 75 74 20 74 77 6f 20 72 6f  to output two ro
25890 77 73 20 74 68 61 74 20 64 75 70 6c 69 63 61 74  ws that duplicat
258a0 65 20 74 68 65 73 65 20 2a 2f 0a 20 20 75 31 36  e these */.  u16
258b0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
258c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
258d0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
258e0 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
258f0 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72   */.  int iAuxAr
25900 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
25910 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
25920 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
25930 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
25940 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ber.            
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25960 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49   If WHERE_USE_LI
25970 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69  MIT, then the li
25980 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b  mit amount */.){
25990 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
259a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
259b0 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
259c0 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
259d0 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
259e0 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
259f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25a00 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
25a10 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
25a20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
25a30 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
25a40 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
25a50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
25a60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
25a70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25a80 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
25a90 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
25aa0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
25ab0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
25ac0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
25ad0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
25ae0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
25af0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
25b00 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
25b10 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
25b20 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
25b30 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
25b40 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
25b50 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
25b60 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
25b70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
25b80 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
25b90 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
25ba0 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
25bb0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
25bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
25bd0 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
25be0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25bf0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25c20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
25c30 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25c40 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
25c50 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
25c60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25c70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25c80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62  n code */.  u8 b
25c90 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20  Fordelete = 0;  
25ca0 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47         /* OPFLAG
25cb0 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65  _FORDELETE or ze
25cc0 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  ro, as appropria
25cd0 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  te */..  assert(
25ce0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
25cf0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
25d00 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20  TIROW)==0 || (. 
25d10 20 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61         (wctrlFla
25d20 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
25d30 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
25d40 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
25d50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
25d60 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
25d70 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
25d80 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
25d90 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 6f 72 20  NETABLE_ONLY or 
25da0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
25db0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
25dc0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25dd0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d  _ONETABLE_ONLY)=
25de0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
25df0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
25e00 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
25e10 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ==0 );..  /* Var
25e20 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
25e30 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
25e40 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
25e50 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
25e60 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
25e70 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
25e80 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
25e90 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
25ea0 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
25eb0 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
25ec0 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
25ed0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
25ee0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
25ef0 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
25f00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
25f10 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
25f20 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
25f30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
25f40 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
25f50 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
25f60 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
25f70 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
25f80 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
25f90 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
25fa0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
25fb0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
25fc0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
25fd0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
25fe0 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
25ff0 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
26000 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
26010 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
26020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
26030 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
26040 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26050 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
26060 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
26070 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
26080 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
26090 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
260a0 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
260b0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
260c0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
260d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
260e0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
260f0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
26100 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
26110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
26120 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
26130 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
26140 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
26150 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
26160 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
26170 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
26180 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
26190 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
261a0 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
261b0 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
261c0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
261d0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
261e0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
261f0 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
26200 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
26210 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
26220 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
26230 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
26240 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
26250 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
26260 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
26270 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
26280 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
26290 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
262a0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
262b0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
262c0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
262d0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
262e0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
262f0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
26300 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
26310 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
26320 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
26330 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
26340 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
26350 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
26360 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
26370 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
26380 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
26390 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
263a0 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
263b0 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
263c0 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
263d0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
263e0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
263f0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
26400 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
26410 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
26420 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
26430 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
26440 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
26450 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
26460 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
26470 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
26480 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
26490 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
264a0 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
264b0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
264c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
264d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
264e0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
264f0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
26500 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
26510 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
26520 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
26530 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
26540 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
26550 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
26560 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
26570 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
26580 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
26590 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
265a0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
265b0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
265c0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
265d0 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e   pWInfo->pDistin
265e0 63 74 53 65 74 20 3d 20 70 44 69 73 74 69 6e 63  ctSet = pDistinc
265f0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
26600 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
26610 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
26620 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
26630 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
26640 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
26650 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
26660 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
26670 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
26680 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
26690 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
266a0 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oop;.  assert( p
266b0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
266c0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
266d0 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
266e0 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
266f0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
26700 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
26710 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
26720 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
26730 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
26740 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
26750 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
26760 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
26770 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
26780 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
26790 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
267a0 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
267b0 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
267c0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
267d0 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
267e0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
267f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
26800 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
26810 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
26820 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
26830 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
26840 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
26850 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
26860 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
26870 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
26880 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
26890 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
268a0 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
268b0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
268c0 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
268d0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
268e0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
268f0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
26900 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
26910 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
26920 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
26930 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
26940 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
26950 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
26960 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
26970 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
26980 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
26990 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
269a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
269b0 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
269c0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
269d0 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
269e0 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
269f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26a00 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26a10 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
26a20 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
26a30 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
26a60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
26a70 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
26a80 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
26a90 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
26aa0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
26ab0 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
26ac0 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
26ad0 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
26ae0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
26af0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
26b00 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
26b10 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
26b20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
26b30 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
26b40 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
26b50 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
26b60 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
26b70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
26b80 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
26b90 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
26ba0 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
26bb0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
26bc0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74   **.  ** The N-t
26bd0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
26be0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73  OM clause is ass
26bf0 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20  igned a bitmask 
26c00 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20  of 1<<N..  **.  
26c10 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74  ** The rule of t
26c20 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
26c30 65 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68 74  ence ensures tht
26c40 61 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  a if X is the bi
26c50 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61  tmask for.  ** a
26c60 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58   table T, then X
26c70 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d 61 73  -1 is the bitmas
26c80 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  k for all other 
26c90 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
26ca0 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e  ft of T..  ** Kn
26cb0 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
26cc0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
26cd0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
26ce0 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20  a left join is. 
26cf0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
26d00 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
26d10 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
26d20 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
26d30 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
26d40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
26d50 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
26d60 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
26d70 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
26d80 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
26d90 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
26da0 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
26db0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
26dc0 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
26dd0 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
26de0 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
26df0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
26e00 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s set..  */.  fo
26e10 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
26e20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
26e30 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
26e40 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
26e50 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
26e60 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
26e70 57 68 65 72 65 54 61 62 46 75 6e 63 41 72 67 73  WhereTabFuncArgs
26e80 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69  (pParse, &pTabLi
26e90 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e  st->a[ii], &pWIn
26ea0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69  fo->sWC);.  }.#i
26eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26ec0 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  G.  for(ii=0; ii
26ed0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
26ee0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d   ii++){.    Bitm
26ef0 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57  ask m = sqlite3W
26f00 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73  hereGetMask(pMas
26f10 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
26f20 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
26f30 20 20 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d      assert( m==M
26f40 41 53 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20  ASKBIT(ii) );.  
26f50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
26f60 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
26f70 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
26f80 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68  . */.  sqlite3Wh
26f90 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70  ereExprAnalyze(p
26fa0 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
26fb0 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62  ->sWC);.  if( db
26fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26fd0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
26fe0 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63  Error;..  if( wc
26ff0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27000 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
27010 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74  {.    if( isDist
27020 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
27030 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
27040 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 44  &pWInfo->sWC, pD
27050 69 73 74 69 6e 63 74 53 65 74 29 20 29 7b 0a 20  istinctSet) ){. 
27060 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
27070 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
27080 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
27090 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
270a0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
270b0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
270c0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
270d0 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
270e0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
270f0 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
27100 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
27110 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
27120 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
27130 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
27140 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
27150 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
27160 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
27170 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 44 69  ->pOrderBy = pDi
27180 73 74 69 6e 63 74 53 65 74 3b 0a 20 20 20 20 7d  stinctSet;.    }
27190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
271a0 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
271b0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  op objects */.#i
271c0 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
271d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20  RACE_ENABLED).  
271e0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
271f0 54 72 61 63 65 20 26 20 30 78 66 66 66 66 20 29  Trace & 0xffff )
27200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
27210 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70  ugPrintf("*** Op
27220 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
27230 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30  * (wctrlFlags: 0
27240 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29  x%x",wctrlFlags)
27250 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
27260 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
27270 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
27280 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27290 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22  tf(", limit: %d"
272a0 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20  , iAuxArg);.    
272b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
272c0 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b  ugPrintf(")\n");
272d0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
272e0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
272f0 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c  x100 ){ /* Displ
27300 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ay all terms of 
27310 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
27320 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
27330 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57     for(i=0; i<sW
27340 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
27350 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
27360 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e  TermPrint(&sWLB.
27370 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20  pWC->a[i], i);. 
27380 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
27390 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
273a0 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
273b0 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
273c0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
273d0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
273e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
273f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
27400 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57  ror;.  .#ifdef W
27410 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
27420 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
27430 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20  3WhereTrace ){  
27440 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
27450 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
27460 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  p objects */.   
27470 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
27480 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
27490 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
274a0 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
274b0 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
274c0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
274d0 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
27510 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
27520 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
27530 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
27540 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
27550 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
27560 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
27570 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
27580 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
27590 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
275a0 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
275b0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
275c0 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
275d0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
275e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
275f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27600 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
27610 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
27620 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
27630 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
27640 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
27650 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
27660 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
27670 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27680 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
27690 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
276a0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
276b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
276c0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
276d0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
276e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
276f0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41  nfo->revMask = A
27700 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66  LLBITS;.  }.  if
27710 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
27720 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
27730 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
27740 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
27750 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
27760 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27770 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
27780 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
27790 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
277a0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
277b0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
277c0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
277d0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
277e0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
277f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27800 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
27810 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
27820 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
27830 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
27840 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
27850 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
27860 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
27870 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
27880 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
27890 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
278a0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
278b0 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
278c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
278d0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
278e0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
278f0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
27900 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27910 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
27920 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
27930 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27940 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
27950 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
27960 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
27970 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27980 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
27990 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
279a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
279b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
279c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
279d0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
279e0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
279f0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
27a00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
27a10 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
27a20 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
27a30 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
27a40 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
27a50 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
27a60 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
27a70 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
27a80 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
27a90 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
27aa0 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 44  evel>=2.   && pD
27ab0 69 73 74 69 6e 63 74 53 65 74 21 3d 30 0a 20 20  istinctSet!=0.  
27ac0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
27ad0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
27ae0 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
27af0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
27b00 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69  k tabUsed = sqli
27b10 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
27b20 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
27b30 70 44 69 73 74 69 6e 63 74 53 65 74 29 3b 0a 20  pDistinctSet);. 
27b40 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
27b50 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61  erBy ){.      ta
27b60 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33  bUsed |= sqlite3
27b70 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
27b80 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c  ge(pMaskSet, sWL
27b90 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  B.pOrderBy);.   
27ba0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57   }.    while( pW
27bb0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20  Info->nLevel>=2 
27bc0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
27bd0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
27be0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
27bf0 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
27c00 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f  ->nLevel-1].pWLo
27c10 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  op;.      if( (p
27c20 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
27c30 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
27c40 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
27c50 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61  _LEFT)==0 ) brea
27c60 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  k;.      if( (wc
27c70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27c80 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d  _WANT_DISTINCT)=
27c90 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  =0.       && (pL
27ca0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
27cb0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a  HERE_ONEROW)==0.
27cc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27ce0 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
27cf0 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
27d00 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b  Self)!=0 ) break
27d10 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73  ;.      pEnd = s
27d20 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c  WLB.pWC->a + sWL
27d30 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  B.pWC->nTerm;.  
27d40 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
27d50 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
27d60 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
27d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
27d80 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
27d90 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
27da0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
27db0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27dc0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
27dd0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
27de0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27df0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27e00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
27e10 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
27e20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57  ) break;.      W
27e30 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
27e40 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
27e50 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
27e60 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
27e70 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65       pWInfo->nLe
27e80 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61  vel--;.      nTa
27e90 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  bList--;.    }. 
27ea0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
27eb0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
27ec0 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
27ed0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
27ee0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
27ef0 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
27f00 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
27f10 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
27f20 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
27f30 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
27f40 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
27f50 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
27f60 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
27f70 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
27f80 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
27f90 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  riate..  */.  as
27fa0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
27fb0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
27fc0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
27fd0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
27fe0 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
27ff0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28000 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
28010 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77  !=0 ){.    int w
28020 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d  sFlags = pWInfo-
28030 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
28040 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62  Flags;.    int b
28050 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67  Onerow = (wsFlag
28060 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
28070 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62 4f  )!=0;.    if( bO
28080 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28 28  nerow.     || ((
28090 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
280a0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
280b0 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20 20  ROW)!=0.        
280c0 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67     && 0==(wsFlag
280d0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
280e0 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b 0a  LTABLE)).    ){.
280f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
28100 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77  nePass = bOnerow
28110 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c   ? ONEPASS_SINGL
28120 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  E : ONEPASS_MULT
28130 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  I;.      if( Has
28140 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e  Rowid(pTabList->
28150 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28 77  a[0].pTab) && (w
28160 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28170 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
28180 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
28190 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
281a0 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20  SS_MULTIROW ){. 
281b0 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65 6c           bFordel
281c0 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52  ete = OPFLAG_FOR
281d0 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  DELETE;.        
281e0 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  }.        pWInfo
281f0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
28200 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67  sFlags = (wsFlag
28210 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f  s & ~WHERE_IDX_O
28220 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NLY);.      }.  
28230 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
28240 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
28250 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
28260 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
28270 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
28280 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
28290 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
282a0 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
282b0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
282c0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
282d0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
282e0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
282f0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
28300 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
28310 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28320 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
28330 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
28340 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
28350 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28360 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
28370 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
28380 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
28390 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
283a0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
283b0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
283c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
283d0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
283e0 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
283f0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
28400 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
28410 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
28420 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
28430 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
28440 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
28450 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
28460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28470 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
28480 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
28490 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
284a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
284b0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
284c0 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
284d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
284e0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
284f0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
28500 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
28510 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
28520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28530 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
28540 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
28550 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
28560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
28570 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
28580 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
28590 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
285a0 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
285b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
285c0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
285d0 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
285e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
285f0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
28600 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
28610 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
28620 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
28630 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
28640 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
28650 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
28660 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
28670 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
28680 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
28690 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
286a0 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
286b0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
286c0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
286d0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
286e0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
286f0 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
28700 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
28710 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
28720 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
28730 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
28740 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
28750 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
28760 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28770 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
28780 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
28790 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
287a0 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
287b0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
287c0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
287d0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
287e0 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
287f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
28800 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
28810 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
28820 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
28830 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
28840 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
28850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28860 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
28870 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
28880 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
28890 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
288a0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
288b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
288c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
288d0 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
288e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
288f0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
28900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28910 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
28920 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  v, OPFLAG_SEEKEQ
28930 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20  |bFordelete);.  
28940 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
28950 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
28960 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
28970 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65  geP5(v, bFordele
28980 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  te);.      }.#if
28990 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
289a0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
289b0 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  SK.      sqlite3
289c0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
289d0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
289e0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
289f0 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  sor, 0, 0,.     
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38         (const u8
28a20 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  *)&pTabItem->col
28a30 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
28a40 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
28a50 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
28a60 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
28a70 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
28a80 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
28a90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
28aa0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
28ab0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
28ac0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
28ad0 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
28ae0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
28af0 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
28b00 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
28b10 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
28b20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20       /* iAuxArg 
28b30 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66  is always set if
28b40 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
28b50 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
28b60 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
28b70 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75       assert( iAu
28b80 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xArg!=0 || (pWIn
28b90 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28ba0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
28bb0 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
28bc0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
28bd0 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69  d(pTab) && IsPri
28be0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78  maryKeyIndex(pIx
28bf0 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74  ).       && (wct
28c00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28c10 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
28c20 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
28c30 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e     /* This is on
28c40 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d  e term of an OR-
28c50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69  optimization usi
28c60 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
28c70 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  EY of a.        
28c80 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ** WITHOUT ROWID
28c90 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64   table.  No need
28ca0 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20   for a separate 
28cb0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
28cc0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
28cd0 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
28ce0 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20        op = 0;.  
28cf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
28d00 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
28d10 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
28d20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
28d30 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
28d40 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
28d50 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
28d60 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
28d70 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
28d80 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
28d90 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
28da0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
28db0 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
28dc0 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
28dd0 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
28de0 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
28df0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
28e00 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
28e10 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
28e20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
28e30 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
28e40 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
28e50 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67  else if( iAuxArg
28e60 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
28e70 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
28e80 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
28e90 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
28ea0 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20   iAuxArg;.      
28eb0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
28ec0 20 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f   & WHERE_REOPEN_
28ed0 49 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65  IDX ) op = OP_Re
28ee0 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d  openIdx;.      }
28ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49  else{.        iI
28f00 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65  ndexCur = pParse
28f10 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
28f20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
28f30 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78  iIdxCur = iIndex
28f40 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
28f50 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
28f60 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
28f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28f80 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
28f90 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a        if( op ){.
28fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28fb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
28fc0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
28fd0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
28fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28ff0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
29000 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
29010 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
29020 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
29030 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20  ONSTRAINT)!=0.  
29040 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
29050 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
29060 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
29070 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29  WHERE_SKIPSCAN))
29080 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
29090 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
290a0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
290b0 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  Y_MIN)==0.      
290c0 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
290d0 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45 5f 44  istinct!=WHERE_D
290e0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a  ISTINCT_ORDERED.
290f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29110 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
29120 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48  AG_SEEKEQ); /* H
29130 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f  int to COMDB2 */
29140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29150 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29160 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
29170 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ame));.#ifdef SQ
29180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
29190 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
291a0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
291b0 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30   u64 colUsed = 0
291c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
291d0 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  ii, jj;.        
291e0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
291f0 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  Ix->nColumn; ii+
29200 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
29210 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75  jj = pIx->aiColu
29220 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  mn[ii];.        
29230 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63      if( jj<0 ) c
29240 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
29250 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29       if( jj>63 )
29260 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20   jj = 63;.      
29270 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49        if( (pTabI
29280 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  tem->colUsed & M
29290 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29  ASKBIT(jj))==0 )
292a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
292b0 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
292c0 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c  = ((u64)1)<<(ii<
292d0 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20  63 ? ii : 63);. 
292e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
292f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29300 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
29310 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49  _ColumnsUsed, iI
29320 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20  ndexCur, 0, 0,. 
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29350 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34  u8*)&colUsed, P4
29360 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
29370 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
29380 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
29390 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20  N_USED_MASK */. 
293a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
293b0 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71   if( iDb>=0 ) sq
293c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
293d0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
293e0 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
293f0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
29400 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29410 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
29420 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
29430 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29440 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
29450 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
29460 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
29470 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
29480 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
29490 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
294a0 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
294b0 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
294c0 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
294d0 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
294e0 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
294f0 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
29500 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
29510 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ii++){.    int a
29520 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
29530 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20  int wsFlags;.   
29540 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
29550 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73  o->a[ii];.    ws
29560 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  Flags = pLevel->
29570 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
29580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29590 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
295a0 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
295b0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
295c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
295d0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
295e0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
295f0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
29600 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  arse, &pWInfo->s
29610 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC,.            
29620 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61      &pTabList->a
29630 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c  [pLevel->iFrom],
29640 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
29650 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
29660 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29670 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
29680 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e  Error;.    }.#en
29690 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c  dif.    addrExpl
296a0 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ain = sqlite3Whe
296b0 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  reExplainOneScan
296c0 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
296d0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
296e0 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e  el, ii, pLevel->
296f0 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67  iFrom, wctrlFlag
29700 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65  s.    );.    pLe
29710 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20  vel->addrBody = 
29720 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
29730 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e  ntAddr(v);.    n
29740 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65  otReady = sqlite
29750 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f  3WhereCodeOneLoo
29760 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
29770 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  i, notReady);.  
29780 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
29790 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  nue = pLevel->ad
297a0 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20  drCont;.    if( 
297b0 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d  (wsFlags&WHERE_M
297c0 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28  ULTI_OR)==0 && (
297d0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
297e0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d  _ONETABLE_ONLY)=
297f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29800 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
29810 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
29820 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
29830 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
29840 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
29850 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
29860 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
29870 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
29880 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
29890 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
298a0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
298b0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
298c0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
298d0 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
298e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
298f0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
29900 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
29910 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
29920 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
29930 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
29940 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
29950 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
29960 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
29970 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
29980 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
29990 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
299a0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
299b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
299c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
299d0 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
299e0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
299f0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
29a00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
29a10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
29a20 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
29a30 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
29a40 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
29a50 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
29a60 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
29a70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29a80 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
29a90 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
29aa0 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
29ab0 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
29ac0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
29ad0 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
29ae0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
29af0 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52  >eDistinct!=WHER
29b00 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
29b10 45 44 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 44  ED || pWInfo->pD
29b20 69 73 74 69 6e 63 74 53 65 74 21 3d 30 29 3b 0a  istinctSet!=0);.
29b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29b40 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
29b50 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
29b60 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
29b70 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
29b80 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
29b90 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
29ba0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
29bb0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
29bc0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29bd0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
29be0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
29bf0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
29c00 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69  p!=OP_Noop ){.#i
29c10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
29c20 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
29c30 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e  ISTINCT.      in
29c40 74 20 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  t n = -1;.      
29c50 69 6e 74 20 6a 2c 20 6b 2c 20 6f 70 3b 0a 20 20  int j, k, op;.  
29c60 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61      int r1 = pPa
29c70 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
29c80 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
29c90 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
29ca0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
29cb0 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
29cc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
29cd0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
29ce0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29cf0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 53  /* This is the S
29d00 6b 69 70 2d 61 68 65 61 64 20 6f 70 74 69 6d 69  kip-ahead optimi
29d10 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 64 6f  zation.  When do
29d20 69 6e 67 20 61 20 44 49 53 54 49 4e 43 54 20 71  ing a DISTINCT q
29d30 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
29d40 74 68 61 74 20 68 61 73 20 57 48 45 52 45 5f 44  that has WHERE_D
29d50 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 2c  ISTINCT_ORDERED,
29d60 20 75 73 65 20 4f 50 5f 53 6b 69 70 47 54 2f 4f   use OP_SkipGT/O
29d70 50 5f 53 6b 69 70 4c 54 20 74 6f 20 73 6b 69 70  P_SkipLT to skip
29d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  .        ** over
29d90 20 61 6c 6c 20 64 75 70 6c 69 63 61 74 65 20 65   all duplicate e
29da0 6e 74 72 69 65 73 2c 20 72 61 74 68 65 72 20 74  ntries, rather t
29db0 68 61 6e 20 76 69 73 69 74 69 6e 67 20 61 6c 6c  han visiting all
29dc0 20 64 75 70 6c 69 63 61 74 65 73 0a 20 20 20 20   duplicates.    
29dd0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 4f 50 5f      ** using OP_
29de0 4e 65 78 74 2f 4f 50 5f 50 72 65 76 2e 20 2a 2f  Next/OP_Prev. */
29df0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
29e00 74 20 2a 70 58 20 3d 20 70 57 49 6e 66 6f 2d 3e  t *pX = pWInfo->
29e10 70 44 69 73 74 69 6e 63 74 53 65 74 3b 0a 20 20  pDistinctSet;.  
29e20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
29e30 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
29e40 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
29e50 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 58     for(j=0; j<pX
29e60 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
29e70 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
29e80 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  E = sqlite3ExprS
29e90 6b 69 70 43 6f 6c 6c 61 74 65 28 70 58 2d 3e 61  kipCollate(pX->a
29ea0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
29eb0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
29ec0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
29ed0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29ee0 45 2d 3e 69 54 61 62 6c 65 21 3d 70 4c 65 76 65  E->iTable!=pLeve
29ef0 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
29f00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
29f10 20 20 20 6b 20 3d 20 31 2b 73 71 6c 69 74 65 33     k = 1+sqlite3
29f20 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
29f30 64 78 2c 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 29  dx, pE->iColumn)
29f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29f50 28 20 6b 3e 6e 20 29 20 6e 20 3d 20 6b 3b 0a 20  ( k>n ) n = k;. 
29f60 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
29f70 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  f( pIdx->aColExp
29f80 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
29f90 20 66 6f 72 28 6b 3d 6e 2b 31 3b 20 6b 3c 70 49   for(k=n+1; k<pI
29fa0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
29fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29fc0 20 45 78 70 72 20 2a 70 49 20 3d 20 70 49 64 78   Expr *pI = pIdx
29fd0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6b 5d  ->aColExpr->a[k]
29fe0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
29ff0 20 20 20 20 20 20 69 66 28 20 70 49 20 26 26 20        if( pI && 
2a000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a010 72 65 28 70 45 2c 70 49 2c 30 29 3c 32 20 29 7b  re(pE,pI,0)<2 ){
2a020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a030 20 6e 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20   n = k+1;.      
2a040 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a060 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a080 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a090 20 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20     if( n>0 ){.  
2a0a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2a0b0 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; j++){.      
2a0c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a0d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2a0e0 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  mn, pLevel->iIdx
2a0f0 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20  Cur, j, r1+j);. 
2a100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a110 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2a120 20 6e 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   n;.        op =
2a130 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2a140 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54  Prev ? OP_SeekLT
2a150 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20   : OP_SeekGT;.  
2a160 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65        k = sqlite
2a170 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2a180 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  , op, pLevel->iI
2a190 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29  dxCur, 0, r1, n)
2a1a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2a1b0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2a1c0 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20  OP_SeekLT);.    
2a1d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2a1e0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
2a1f0 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  kGT);.        sq
2a200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a210 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70  v, OP_Goto, 1, p
2a220 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
2a230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2a240 75 6d 70 48 65 72 65 28 76 2c 20 6b 29 3b 0a 20  umpHere(v, k);. 
2a250 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2a260 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41  f /* SQLITE_DISA
2a270 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2a280 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20  STINCT */.      
2a290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2a2a0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41 64   common case: Ad
2a2b0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
2a2c0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  t row */.       
2a2d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a2e0 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
2a2f0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
2a300 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
2a310 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 20 20 73  ->p3);.        s
2a320 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a330 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
2a340 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2a350 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2a360 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2a370 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2a380 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
2a390 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2a3a0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2a3b0 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2a3c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2a3d0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2a3e0 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20  ==OP_VNext);.   
2a3f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2a400 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2a410 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
2a420 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
2a430 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
2a440 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
2a450 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
2a460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a470 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2a480 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
2a490 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
2a4a0 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
2a4b0 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
2a4c0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
2a4d0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
2a4e0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
2a4f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2a500 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
2a510 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
2a520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a530 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2a540 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
2a550 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
2a560 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2a570 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2a580 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2a590 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2a5a0 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70  pOp==OP_PrevIfOp
2a5b0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  en);.        Vdb
2a5c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2a5d0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2a5e0 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a  OP_NextIfOpen);.
2a5f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2a610 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
2a620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2a640 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2a650 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
2a660 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2a670 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20  >addrSkip ){.   
2a680 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
2a690 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
2a6a0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
2a6b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2a6c0 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
2a6d0 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
2a6e0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
2a6f0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
2a700 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2a710 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2a720 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
2a730 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2a740 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2a750 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23  Skip-2);.    }.#
2a760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
2a770 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
2a780 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c  BLOBS.    if( pL
2a790 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
2a7a0 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  p ){.      int o
2a7b0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  p;.      if( sql
2a7c0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2a7d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
2a7e0 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20  eRep-1)->p1 ){. 
2a7f0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44         op = OP_D
2a800 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20  ecrJumpZero;.   
2a810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a820 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65    op = OP_JumpZe
2a830 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a  roIncr;.      }.
2a840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a850 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
2a860 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
2a870 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ntr, pLevel->add
2a880 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
2a890 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2a8a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2a8b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
2a8c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
2a8d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2a8e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2a8f0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2a900 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2a910 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2a920 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2a930 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2a940 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2a950 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2a960 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a970 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2a980 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
2a990 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a9a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2a9b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2a9c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2a9d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
2a9e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
2a9f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
2aa00 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2aa10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2aa20 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
2aa30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2aa40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2aa50 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
2aa60 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2aa70 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2aa80 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
2aa90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2aaa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2aab0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
2aac0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
2aad0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
2aae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2aaf0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2ab00 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2ab10 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2ab20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2ab30 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2ab40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
2ab50 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2ab60 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
2ab70 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2aba0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2abb0 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
2abc0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
2abd0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2abe0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2abf0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2ac00 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2ac10 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2ac20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2ac30 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2ac40 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2ac50 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2ac60 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
2ac70 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2ac80 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2ac90 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2aca0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2acb0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
2acc0 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
2acd0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2ace0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
2acf0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2ad00 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2ad10 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2ad20 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2ad30 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2ad40 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2ad50 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2ad60 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
2ad70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2ad80 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
2ad90 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
2ada0 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
2adb0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
2adc0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
2add0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
2ade0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
2adf0 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
2ae00 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
2ae10 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
2ae20 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
2ae30 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
2ae40 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2ae50 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2ae60 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2ae70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74  ailed ){.      t
2ae80 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
2ae90 43 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Copy(v, pLevel->
2aea0 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c  addrBody, pLevel
2aeb0 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  ->iTabCur,.     
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d         pTabItem-
2aee0 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a  >regResult, 0);.
2aef0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2af00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
2af10 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
2af20 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
2af30 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
2af40 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
2af50 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
2af60 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
2af70 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
2af80 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
2af90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2afa0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f   ** (WHERE_OMIT_
2afb0 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e  OPEN_CLOSE).  An
2afc0 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
2afd0 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
2afe0 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
2aff0 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
2b000 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
2b010 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2b020 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2b030 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2b040 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
2b050 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
2b060 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b070 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b080 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
2b090 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
2b0a0 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
2b0b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
2b0c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b0d0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b0e0 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20 57  S_OFF && (ws & W
2b0f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2b100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2b110 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b120 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
2b130 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2b140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b150 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
2b160 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
2b170 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
2b180 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f  _IPK|WHERE_AUTO_
2b190 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20  INDEX))==0 .    
2b1a0 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49     && pLevel->iI
2b1b0 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61  dxCur!=pWInfo->a
2b1c0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20  iCurOnePass[1]. 
2b1d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b1e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b1f0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
2b200 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
2b210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2b220 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
2b230 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
2b240 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64  x, make VDBE cod
2b250 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
2b260 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
2b270 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
2b280 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72  ex instead of fr
2b290 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65  om the table whe
2b2a0 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e  re possible.  In
2b2b0 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20   some cases.    
2b2c0 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
2b2d0 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68  tion prevents th
2b2e0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65  e table from eve
2b2f0 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68  r being read, wh
2b300 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79  ich can.    ** y
2b310 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61  ield a significa
2b320 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  nt performance b
2b330 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  oost..    ** .  
2b340 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
2b350 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
2b360 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
2b370 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
2b380 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
2b390 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
2b3a0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
2b3b0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
2b3c0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
2b3d0 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
2b3e0 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
2b3f0 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
2b400 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
2b410 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
2b420 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
2b430 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
2b440 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
2b450 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
2b460 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
2b470 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
2b480 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2b490 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
2b4a0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
2b4b0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
2b4c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2b4d0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
2b4e0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2b4f0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2b500 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
2b510 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
2b520 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
2b530 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20  f( pIdx.     && 
2b540 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73  (pWInfo->eOnePas
2b550 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c  s==ONEPASS_OFF |
2b560 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78  | !HasRowid(pIdx
2b570 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20  ->pTable)).     
2b580 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
2b590 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20  iled.    ){.    
2b5a0 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
2b5b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b5c0 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
2b5d0 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
2b5e0 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
2b5f0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
2b600 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
2b610 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
2b620 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2b630 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
2b640 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
2b650 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2b660 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2b670 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
2b680 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f        int x = pO
2b690 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
2b6a0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
2b6b0 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
2b6c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
2b6d0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
2b6f0 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
2b700 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2b710 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
2b720 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
2b730 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20  lumn[x];.       
2b740 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
2b750 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0 );.          }
2b760 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
2b770 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
2b780 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
2b790 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
2b7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b7b0 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
2b7c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
2b7d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
2b7e0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
2b7f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b800 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2b810 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2b820 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
2b830 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2b840 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2b850 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
2b860 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
2b870 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2b880 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
2b890 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
2b8a0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
2b8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b8c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
2b8d0 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
2b8e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2b8f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
2b900 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
2b910 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
2b920 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
2b930 6e 3b 0a 7d 0a                                   n;.}.