/ Hex Artifact Content
Login

Artifact bada38bf45ea4437318164f915243b3f0822ceda:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0690: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
06a0: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
06b0: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  o in order to co
06c0: 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69  ntinue.** immedi
06d0: 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e  ately with the n
06e0: 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45  ext row of a WHE
06f0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  RE clause..*/.in
0700: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  t sqlite3WhereCo
0710: 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72  ntinueLabel(Wher
0720: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0730: 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
0740: 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ->iContinue!=0 )
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
0760: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
0770: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0780: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
0790: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
07a0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
07b0: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
07c0: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
07d0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
07e0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
07f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0800: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0810: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
0820: 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f   Return ONEPASS_
0830: 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50  OFF (0) if an UP
0840: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
0850: 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62  tatement is unab
0860: 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65  le to.** operate
0870: 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
0880: 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20   rowis returned 
0890: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
08a0: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e  e.  Return.** ON
08b0: 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29  EPASS_SINGLE (1)
08c0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
08d0: 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  t can operation 
08e0: 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65  directly because
08f0: 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c   only.** a singl
0900: 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63  e row is to be c
0910: 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20  hanged.  Return 
0920: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32  ONEPASS_MULTI (2
0930: 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73  ) if the one-pas
0940: 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s.** optimizatio
0950: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e  n can be used on
0960: 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a   multiple .**.**
0970: 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20   If the ONEPASS 
0980: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
0990: 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f  used (if this ro
09a0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
09b0: 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f  ue).** then also
09c0: 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63   write the indic
09d0: 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f  es of open curso
09e0: 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41  rs used by ONEPA
09f0: 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72  SS.** into aiCur
0a00: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0a10: 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73  .  iaCur[0] gets
0a20: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   the cursor of t
0a30: 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65  he data.** table
0a40: 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65   and iaCur[1] ge
0a50: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  ts the cursor us
0a60: 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61  ed by an auxilia
0a70: 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74  ry index..** Eit
0a80: 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65  her value may be
0a90: 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
0aa0: 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e  that cursor is n
0ab0: 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20  ot used..** Any 
0ac0: 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64  cursors returned
0ad0: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
0ae0: 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
0af0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b  ng..**.** aiCur[
0b00: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20  0] and aiCur[1] 
0b10: 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74  both get -1 if t
0b20: 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20  he where-clause 
0b30: 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62  logic is.** unab
0b40: 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e  le to use the ON
0b50: 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
0b60: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
0b70: 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73  e3WhereOkOnePass
0b80: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0b90: 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b  fo, int *aiCur){
0ba0: 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c  .  memcpy(aiCur,
0bb0: 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
0bc0: 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e  ePass, sizeof(in
0bd0: 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48  t)*2);.#ifdef WH
0be0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
0bf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
0c00: 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e  ereTrace && pWIn
0c10: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
0c20: 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
0c30: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0c40: 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a  ntf("%s cursors:
0c50: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
0c60: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
0c70: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49  Pass==ONEPASS_SI
0c80: 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f  NGLE ? "ONEPASS_
0c90: 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41  SINGLE" : "ONEPA
0ca0: 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20  SS_MULTI",.     
0cb0: 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69      aiCur[0], ai
0cc0: 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e  Cur[1]);.  }.#en
0cd0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49  dif.  return pWI
0ce0: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d  nfo->eOnePass;.}
0cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
0d00: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63   content of pSrc
0d10: 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73   into pDest.*/.s
0d20: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
0d30: 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65  OrMove(WhereOrSe
0d40: 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f  t *pDest, WhereO
0d50: 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70  rSet *pSrc){.  p
0d60: 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e  Dest->n = pSrc->
0d70: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73  n;.  memcpy(pDes
0d80: 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70  t->a, pSrc->a, p
0d90: 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70  Dest->n*sizeof(p
0da0: 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a  Dest->a[0]));.}.
0db0: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e  ./*.** Try to in
0dc0: 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65  sert a new prere
0dd0: 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74  quisite/cost ent
0de0: 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  ry into the Wher
0df0: 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a  eOrSet pSet..**.
0e00: 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79  ** The new entry
0e10: 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
0e20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
0e30: 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
0e40: 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20  be.** appended, 
0e50: 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  or it might be d
0e60: 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68  iscarded.  Do wh
0e70: 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69  atever is the ri
0e80: 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20  ght thing.** so 
0e90: 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20  that pSet keeps 
0ea0: 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65  the N_OR_COST be
0eb0: 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20  st entries seen 
0ec0: 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69  so far..*/.stati
0ed0: 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73  c int whereOrIns
0ee0: 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65  ert(.  WhereOrSe
0ef0: 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a  t *pSet,      /*
0f00: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
0f10: 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f  to be updated */
0f20: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
0f30: 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  q,        /* Pre
0f40: 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68  requisites of th
0f50: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  e new entry */. 
0f60: 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20   LogEst rRun,   
0f70: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63          /* Run-c
0f80: 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65  ost of the new e
0f90: 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ntry */.  LogEst
0fa0: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20   nOut           
0fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
0fc0: 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65  tputs for the ne
0fd0: 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20  w entry */.){.  
0fe0: 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72  u16 i;.  WhereOr
0ff0: 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69  Cost *p;.  for(i
1000: 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74  =pSet->n, p=pSet
1010: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1020: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75  ++){.    if( rRu
1030: 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70  n<=p->rRun && (p
1040: 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65  rereq & p->prere
1050: 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20  q)==prereq ){.  
1060: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72      goto whereOr
1070: 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20  Insert_done;.   
1080: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1090: 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e  un<=rRun && (p->
10a0: 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29  prereq & prereq)
10b0: 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ==p->prereq ){. 
10c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10e0: 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54  Set->n<N_OR_COST
10f0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65   ){.    p = &pSe
1100: 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b  t->a[pSet->n++];
1110: 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  .    p->nOut = n
1120: 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Out;.  }else{.  
1130: 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20    p = pSet->a;. 
1140: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53     for(i=1; i<pS
1150: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1160: 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70     if( p->rRun>p
1170: 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29  Set->a[i].rRun )
1180: 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69   p = pSet->a + i
1190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11a0: 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20  p->rRun<=rRun ) 
11b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68  return 0;.  }.wh
11c0: 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65  ereOrInsert_done
11d0: 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20  :.  p->prereq = 
11e0: 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75  prereq;.  p->rRu
11f0: 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20  n = rRun;.  if( 
1200: 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70  p->nOut>nOut ) p
1210: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
1220: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1230: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
1240: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
1250: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
1260: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
1270: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
1280: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
1290: 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65  /.Bitmask sqlite
12a0: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68  3WhereGetMask(Wh
12b0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
12c0: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
12d0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
12e0: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
12f0: 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  >n<=(int)sizeof(
1300: 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  Bitmask)*8 );.  
1310: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
1320: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1330: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
1340: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
1350: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d  {.      return M
1360: 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
1370: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1390: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
13a0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
13b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
13c0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
13d0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
13e0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
13f0: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
1400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1410: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
1420: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
1430: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
1440: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
1450: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
1460: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
1470: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
1480: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
1490: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
14a0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
14b0: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
14c0: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
14d0: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
14e0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
14f0: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
1500: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
1510: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
1520: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
1530: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  or;.}../*.** Adv
1540: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1550: 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20   WhereTerm that 
1560: 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e  matches accordin
1570: 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69  g to the criteri
1580: 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64  a.** established
1590: 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20   when the pScan 
15a0: 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69  object was initi
15b0: 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53  alized by whereS
15c0: 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65  canInit()..** Re
15d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
15e0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d  re are no more m
15f0: 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72  atching WhereTer
1600: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  ms..*/.static Wh
1610: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
1620: 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e  anNext(WhereScan
1630: 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20   *pScan){.  int 
1640: 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1650: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
1660: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
1670: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69   term */.  i16 i
1680: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1690: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e  /* The column on
16a0: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16b0: 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50  term.  -1 for IP
16c0: 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b  K */.  Expr *pX;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  n expression bei
16f0: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57  ng tested */.  W
1700: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1710: 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64      /* Shorthand
1720: 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20   for pScan->pWC 
1730: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1740: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65  pTerm;    /* The
1750: 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74   term being test
1760: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20  ed */.  int k = 
1770: 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20  pScan->k;    /* 
1780: 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73  Where to start s
1790: 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68  canning */..  wh
17a0: 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ile( pScan->iEqu
17b0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
17c0: 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20  v ){.    iCur = 
17d0: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
17e0: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
17f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63     iColumn = pSc
1800: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53 63  an->aiColumn[pSc
1810: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1820: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
1830: 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61 6e  XN_EXPR && pScan
1840: 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29 20  ->pIdxExpr==0 ) 
1850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
1860: 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61  ile( (pWC = pSca
1870: 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20  n->pWC)!=0 ){.  
1880: 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1890: 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e  C->a+k; k<pWC->n
18a0: 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d  Term; k++, pTerm
18b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18c0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
18d0: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
18e0: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
18f0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
1900: 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69  n.         && (i
1910: 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a  Column!=XN_EXPR.
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1930: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1940: 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  re(pTerm->pExpr-
1950: 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70 49  >pLeft,pScan->pI
1960: 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29  dxExpr,iCur)==0)
1970: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
1980: 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c  can->iEquiv<=1 |
1990: 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
19a0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
19b0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
19c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
19d0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
19f0: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
1a00: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
1a10: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
1a20: 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20  Scan->aiCur).   
1a30: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d          && (pX =
1a40: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1a50: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
1a60: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
1a70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
1a80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1a90: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
1aa0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1ab0: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
1ac0: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
1ad0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
1ae0: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
1af0: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
1b00: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
1b10: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
1b20: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b70: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
1b80: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
1b90: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
1ba0: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
1bb0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1bc0: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
1bd0: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
1be0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
1bf0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
1c00: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1c10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c20: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1c30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
1c40: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
1c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c60: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
1c70: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
1c80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
1c90: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
1ca0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
1cb0: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
1cc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1cd0: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
1cf0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
1d10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
1d20: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1d40: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d60: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
1d70: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
1d80: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
1d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dd0: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
1de0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
1df0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1e00: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1e10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
1e50: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e70: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
1e80: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1e90: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1eb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ec0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
1ed0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f20: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1f30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1f40: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1f60: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1f70: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
1f80: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1f90: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
1fa0: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
1fb0: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
1fc0: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
1fd0: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
1fe0: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
1ff0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2000: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2010: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2020: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
2030: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2050: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
2060: 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20  ->k = k+1;.     
2070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
2080: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
2090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a0: 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e   }.      pScan->
20b0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
20c0: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
20d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  k = 0;.    }.   
20e0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
20f0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20  can->pOrigWC;.  
2100: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63    k = 0;.    pSc
2110: 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20  an->iEquiv++;.  
2120: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2130: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2140: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2150: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
2160: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2170: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
2180: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
2190: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
21a0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
21b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
21c0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
21d0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
21e0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
21f0: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
2200: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2210: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2220: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
2230: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
2240: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
2250: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
2260: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
2270: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
2280: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
2290: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
22a0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
22b0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
22c0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
22d0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
22e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
22f0: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
2300: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2310: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
2320: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
2330: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
2340: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
2350: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
2360: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
2370: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
2380: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
2390: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
23a0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
23b0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
23c0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
23d0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
23e0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
23f0: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
2400: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
2410: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
2420: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
2430: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
2440: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
2450: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2460: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2470: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
2480: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2490: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
24a0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
24b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
24c0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
24d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24f0: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
2500: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
2510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2520: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
2530: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
2540: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2550: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2560: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
2570: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
2580: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 0a  {.  int j = 0;..
2590: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
25a0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
25b0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
25c0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
25d0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
25e0: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
25f0: 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20 69  IdxExpr = 0;.  i
2600: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 6a  f( pIdx ){.    j
2610: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = iColumn;.    
2620: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
2630: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2640: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
2650: 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e 70  _EXPR ) pScan->p
2660: 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  IdxExpr = pIdx->
2670: 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
2680: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
2690: 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e  pIdx && iColumn>
26a0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  =0 ){.    pScan-
26b0: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
26c0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
26d0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
26e0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
26f0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
2700: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
2710: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
2720: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
2730: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
2740: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
2750: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
2760: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
2770: 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30    pScan->aiCur[0
2780: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
2790: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d  n->aiColumn[0] =
27a0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
27b0: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->nEquiv = 1;. 
27c0: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
27d0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   1;.  return whe
27e0: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
27f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
2800: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
2810: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2820: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
2830: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2840: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
2850: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2860: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
2870: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
2880: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
2890: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
28a0: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
28b0: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
28c0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
28d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28e0: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
28f0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
2900: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64  nd..**.** If pId
2910: 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63 68  x!=0 then search
2920: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2930: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2940: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2950: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2960: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2970: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2980: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2990: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
29a0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
29b0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
29c0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
29d0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
29e0: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
29f0: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2a00: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2a10: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2a20: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2a30: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2a40: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2a50: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2a60: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2a70: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2a80: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2a90: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2aa0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2ab0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2ac0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2ad0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2ae0: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2af0: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2b00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2b10: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2b20: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2b30: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2b40: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2b50: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2b60: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2b70: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2b80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2b90: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ba0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2bb0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2bd0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2be0: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2bf0: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2c00: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2c10: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2c20: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2c30: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2c40: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2c50: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2c60: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2c70: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2c80: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2c90: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2ca0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2cb0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2cc0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2cd0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
2ce0: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
2cf0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
2d00: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
2d10: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
2d20: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
2d30: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
2d40: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
2d50: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
2d60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2d70: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
2d80: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
2d90: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
2da0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
2db0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2dc0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
2dd0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2df0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
2e00: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2e10: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
2e20: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
2e30: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
2e40: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
2e70: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
2e80: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
2e90: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2ea0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
2eb0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
2ec0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
2ed0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
2ee0: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
2ef0: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
2f00: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
2f10: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
2f20: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
2f30: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
2f40: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
2f50: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
2f60: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
2f70: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
2f80: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
2f90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
2fa0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
2fb0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
2fc0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
2fd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2fe0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
2ff0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3000: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3010: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3020: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3030: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3040: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3050: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3060: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3070: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
3080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3090: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
30a0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
30b0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
30c0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
30d0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
30e0: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
30f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3100: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3110: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3120: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3130: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3140: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3150: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3160: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3170: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
3180: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3190: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
31a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
31b0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
31d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
31e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
31f0: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3210: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3220: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3230: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3240: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3260: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3270: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
3280: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
32b0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
32c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
32d0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
32e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
32f0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3300: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3310: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3320: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3330: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3340: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3350: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3360: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3370: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
3380: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
3390: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
33a0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
33b0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
33c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
33d0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
33e0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
33f0: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3400: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3410: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3420: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3430: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3440: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3450: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3460: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3470: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
3480: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
3490: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
34a0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
34b0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
34c0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
34d0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
34e0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
34f0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3500: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3510: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3520: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3530: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3540: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3550: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3570: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
3580: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
3590: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
35a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
35b0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
35c0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
35d0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
35e0: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
35f0: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3600: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3620: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3630: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3640: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3650: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3660: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3670: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
3680: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
3690: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
36a0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
36b0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
36c0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
36d0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
36e0: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
36f0: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3710: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3720: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3730: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3740: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3750: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3760: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3770: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3790: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
37a0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
37b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
37c0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
37d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
37e0: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
37f0: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3800: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3810: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3820: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3850: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3860: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3870: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3880: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3890: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
38a0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
38b0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
38c0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
38d0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
38e0: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
38f0: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3900: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3910: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3930: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3940: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3950: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3960: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3970: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3980: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3990: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
39a0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
39b0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
39c0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
39d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
39e0: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
39f0: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3a00: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3a10: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3a20: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3a30: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3a40: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3a50: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3a60: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3a70: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3a80: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3a90: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3aa0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3ab0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3ac0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3ad0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3ae0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3af0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3b00: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3b10: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3b20: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3b30: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3b40: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3b50: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3b60: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3b70: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3b80: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3b90: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ba0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3bb0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3bc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3bd0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3be0: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3bf0: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3c00: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3c10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3c20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3c30: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3c40: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3c50: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3c60: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3c70: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3c80: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3c90: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3ca0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3cb0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3cc0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3cd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
3ce0: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
3cf0: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
3d00: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
3d10: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
3d20: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
3d30: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
3d40: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
3d50: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
3d60: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
3d70: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
3d80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
3d90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
3da0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
3db0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
3dc0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
3dd0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
3de0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
3df0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
3e00: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
3e10: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
3e20: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
3e30: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
3e40: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
3e50: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3e60: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3e70: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
3e80: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
3e90: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
3ea0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
3eb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3ec0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
3ed0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
3ee0: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
3ef0: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
3f00: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3f10: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
3f20: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
3f30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
3f40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3f50: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
3f60: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
3f70: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
3f80: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
3f90: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
3fa0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
3fb0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
3fc0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
3fd0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
3fe0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
3ff0: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4000: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4010: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4020: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4030: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4040: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4050: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4060: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4070: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
4080: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
4090: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
40a0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
40b0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
40c0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
40d0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
40e0: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
40f0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4100: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4110: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4120: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4130: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4140: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4150: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4160: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4170: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
4180: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
4190: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
41a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
41b0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
41c0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
41d0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
41e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
41f0: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4200: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64 62  umnToCopy(.  Vdb
4210: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
4220: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f 6e   /* The VDBE con
4230: 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f 20  taining code to 
4240: 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20 69  translate */.  i
4250: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4260: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4270: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
4280: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
4290: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
42a0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
42b0: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
42c0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
42d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
42e0: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
42f0: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4300: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4310: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4320: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4330: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4340: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
4350: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
4360: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70 20   */.){.  VdbeOp 
4370: 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  *pOp = sqlite3Vd
4380: 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61 72  beGetOp(v, iStar
4390: 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  t);.  int iEnd =
43a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
43b0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66 6f  entAddr(v);.  fo
43c0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
43d0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
43e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
43f0: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4400: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4410: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4420: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4430: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4440: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4450: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4460: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4470: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
4480: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
4490: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
44a0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
44b0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
44c0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
44d0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
44e0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
44f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4500: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4510: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4520: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4530: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4540: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4550: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4560: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4570: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
4580: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4590: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
45a0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
45b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
45c0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
45d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
45e0: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
45f0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
4600: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
4610: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
4620: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
4630: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
4640: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
4650: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
4660: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
4670: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
4680: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
4690: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
46a0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
46b0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
46c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
46d0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
46e0: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
46f0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
4700: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4710: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
4720: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4740: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4750: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4760: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4770: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4780: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4790: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
47a0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
47b0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
47c0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
47d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
47e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
47f0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4800: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
4810: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
4820: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4830: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
4840: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4850: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
4860: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4870: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
4880: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4890: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
48a0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
48b0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
48c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
48d0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
48e0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
48f0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
4900: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
4910: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
4920: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
4930: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4940: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4950: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4960: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4970: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4980: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4990: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
49a0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
49b0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
49c0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
49d0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
49e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
49f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
4a00: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4a10: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
4a20: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
4a30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4a40: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
4a50: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
4a60: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4a70: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
4a80: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
4a90: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4aa0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
4ab0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
4ac0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4af0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
4b00: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
4b10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4b20: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4b30: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
4b40: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
4b50: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
4b60: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
4b70: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
4b80: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
4b90: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
4ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4bb0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4bc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4bd0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
4be0: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
4bf0: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
4c00: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
4c10: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
4c20: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
4c30: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
4c40: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
4c50: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
4c60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
4c70: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
4c80: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4c90: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
4ca0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4cb0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
4cc0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
4cd0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
4ce0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
4cf0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
4d00: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
4d10: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
4d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
4d30: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
4d40: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
4d50: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
4d60: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
4d70: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
4d80: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
4d90: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
4da0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
4db0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
4dc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4dd0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
4de0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
4df0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4e00: 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
4e10: 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
4e20: 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
4e30: 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
4e40: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
4e50: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
4e60: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
4e70: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
4e80: 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
4e90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65  ) return 0;.  te
4ea0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
4eb0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
4ec0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
4ed0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
4ee0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4ef0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
4f00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4f10: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
4f20: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
4f30: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
4f40: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
4f50: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
4f60: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
4f70: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
4f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
4f90: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
4fa0: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
4fb0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
4fc0: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
4fd0: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5000: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
5010: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
5020: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
5030: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
5040: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
5050: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
5060: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
5070: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
5080: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
5090: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
50a0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
50b0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
50c0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
50d0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
50e0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
50f0: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
5100: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
5110: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
5120: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5140: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
5150: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
5160: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
5170: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
5180: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
5190: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
51a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
51b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
51c0: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
51d0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
51e0: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
51f0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
5200: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
5210: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
5220: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
5230: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
5260: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
5270: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
5280: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
5290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
52a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
52b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
52c0: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
52d0: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
52e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
52f0: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
5300: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
5310: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
5320: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
5330: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
5340: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
5350: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
5360: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5370: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
5380: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
5390: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
53b0: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
53c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
53e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
53f0: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5410: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
5420: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
5430: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
5440: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
5450: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
5460: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
5470: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
5480: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
5490: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
54a0: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
54b0: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
54c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
54d0: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
54e0: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
54f0: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
5500: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
5510: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
5520: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
5530: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
5540: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
5550: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
5560: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5570: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
5580: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
5590: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
55a0: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
55b0: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
55c0: 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c    Expr *pPartial
55d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
55e0: 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45   Partial Index E
55f0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
5600: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30  nt iContinue = 0
5610: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
5620: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
5630: 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f  excluded rows */
5640: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5650: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
5660: 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
5670: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64  e term being ind
5680: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5690: 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20  drCounter = 0;  
56a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
56b0: 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20 63   where integer c
56c0: 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61  ounter is initia
56d0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  lized */.  int r
56e0: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
56f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
5700: 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68 65  of registers whe
5710: 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73 73  re record is ass
5720: 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  embled */..  /* 
5730: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
5740: 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
5750: 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
5760: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
5770: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
5780: 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
5790: 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
57a0: 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
57b0: 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
57c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
57d0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
57e0: 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
57f0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
5800: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
5810: 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  e(v);..  /* Coun
5820: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5830: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
5840: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
5850: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
5860: 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
5870: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
5880: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65  traints */.  nKe
5890: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  yCol = 0;.  pTab
58a0: 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
58b0: 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
58c0: 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
58d0: 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
58e0: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
58f0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
5900: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
5910: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
5920: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
5930: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
5940: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
5950: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5960: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
5970: 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65  mJoin)    /* pre
5980: 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a  req always non-z
5990: 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ero */.         
59a0: 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
59b0: 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d  JoinTable!=pSrc-
59c0: 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20  >iCursor   /*   
59d0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
59e0: 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  nd   */.        
59f0: 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65   || pLoop->prere
5a00: 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  q!=0 );         
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
5a20: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
5a30: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   JOIN */.    if(
5a40: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d   pLoop->prereq==
5a50: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
5a60: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5a70: 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20  _VIRTUAL)==0.   
5a80: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5a90: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5aa0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
5ab0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  & sqlite3ExprIsT
5ac0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78  ableConstant(pEx
5ad0: 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  pr, pSrc->iCurso
5ae0: 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  r) ){.      pPar
5af0: 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  tial = sqlite3Ex
5b00: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
5b10: 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20  , pPartial,.    
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5b40: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
5b50: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
5b60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5b70: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5b80: 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
5b90: 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
5ba0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
5bb0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
5bc0: 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
5bd0: 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
5be0: 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
5bf0: 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
5c00: 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
5c10: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
5c20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5c30: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
5c40: 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
5c50: 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
5c60: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5c70: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
5c80: 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
5c90: 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
5ca0: 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
5cb0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
5cd0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
5ce0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
5cf0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
5d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5d10: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
5d20: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
5d30: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
5d40: 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
5d50: 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f  b, pLoop, nKeyCo
5d60: 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l+1) ){.        
5d70: 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f    goto end_auto_
5d80: 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20  index_create;.  
5d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5da0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
5db0: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
5dc0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
5dd0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
5de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5df0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
5e00: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
5e10: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
5e20: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
5e30: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
5e40: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
5e50: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
5e60: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
5e70: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
5e90: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
5ea0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
5ec0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
5ed0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
5ee0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
5ef0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
5f00: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
5f10: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
5f20: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
5f30: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
5f40: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
5f50: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
5f60: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
5f70: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
5f80: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
5f90: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
5fa0: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
5fb0: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
5fc0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5fd0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
5fe0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
5ff0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
6000: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
6010: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
6020: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
6030: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
6040: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
6050: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
6060: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
6070: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
6080: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
6090: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
60a0: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
60b0: 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65  MIN(BMS-1,pTable
60c0: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63  ->nCol);.  testc
60d0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
60e0: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
60f0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6100: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
6110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
6120: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6130: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
6140: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
6150: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
6160: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
6170: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
6180: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
6190: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
61a0: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a  - BMS + 1;.  }..
61b0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
61c0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
61d0: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
61e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78   index */.  pIdx
61f0: 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
6200: 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50  teIndexObject(pP
6210: 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f  arse->db, nKeyCo
6220: 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65  l+1, 0, &zNotUse
6230: 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  d);.  if( pIdx==
6240: 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74  0 ) goto end_aut
6250: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
6260: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
6270: 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
6280: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
6290: 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
62a0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
62b0: 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
62c0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
62d0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
62e0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
62f0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
6300: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
6310: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
6320: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
6330: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
6340: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
6350: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
6360: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
6370: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
6380: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
6390: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
63a0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63b0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
63c0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
63d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
63e0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
63f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
6400: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
6410: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
6420: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6430: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
6440: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
6450: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
6460: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
6470: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
6480: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
6490: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
64a0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
64b0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
64c0: 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  l[n] = pColl ? p
64d0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71  Coll->zName : sq
64e0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
64f0: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
6500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6510: 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
6520: 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
6530: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
6540: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
6550: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
6560: 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
6570: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
6580: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6590: 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
65a0: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
65b0: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
65c0: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
65d0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
65e0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
65f0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
6600: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
6610: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
6620: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
6630: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
6640: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
6650: 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  S-1) ){.    for(
6660: 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
6670: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
6680: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6690: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
66a0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
66b0: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
66c0: 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  NARY;.      n++;
66d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
66e0: 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
66f0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
6700: 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[n] = XN_ROWI
6710: 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  D;.  pIdx->azCol
6720: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
6730: 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20 43  rBINARY;..  /* C
6740: 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
6750: 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  tic index */.  a
6760: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
6770: 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
6780: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
6790: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
67a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp2(v, OP_OpenA
67c0: 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
67d0: 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43  ->iIdxCur, nKeyC
67e0: 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ol+1);.  sqlite3
67f0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6800: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
6810: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
6820: 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
6830: 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
6840: 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
6850: 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
6860: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
6870: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
6880: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  sh(pParse);.  pT
6890: 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70  abItem = &pWC->p
68a0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
68b0: 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
68c0: 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  ];.  if( pTabIte
68d0: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
68e0: 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
68f0: 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
6900: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
6910: 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20    addrCounter = 
6920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6930: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6940: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6950: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6960: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
6970: 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
6980: 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
6990: 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64 72  llSub);.    addr
69a0: 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56 64  Top =  sqlite3Vd
69b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
69c0: 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
69d0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
69e0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
69f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
6a00: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
6a10: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
6a20: 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  zName));.  }else
6a30: 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  {.    addrTop = 
6a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a50: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
6a60: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
6a70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6a80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
6a90: 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f  rtial ){.    iCo
6aa0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
6ab0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6ad0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
6ae0: 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74   pPartial, iCont
6af0: 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  inue, SQLITE_JUM
6b00: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c  PIFNULL);.    pL
6b10: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
6b20: 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58  WHERE_PARTIALIDX
6b30: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72  ;.  }.  regRecor
6b40: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6b50: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6b60: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
6b70: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
6b80: 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ey(.      pParse
6b90: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
6ba0: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
6bb0: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20  rd, 0, 0, 0, 0. 
6bc0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6bd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6be0: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6bf0: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6c00: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6c10: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6c20: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6c30: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6c40: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6c50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6c60: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6c70: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6c80: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ca0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
6cb0: 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65  Counter, regBase
6cc0: 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61  +n);.    transla
6cd0: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76  teColumnToCopy(v
6ce0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
6cf0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61 62  l->iTabCur, pTab
6d00: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
6d10: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
6d20: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
6d30: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
6d40: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
6d50: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
6d60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6d70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
6d80: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
6d90: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
6da0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6db0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6dc0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6dd0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
6de0: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
6df0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6e00: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
6e10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e30: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
6e40: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
6e50: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
6e60: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
6e70: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
6e80: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
6e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
6ea0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
6eb0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
6ec0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
6ed0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6ee0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
6ef0: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
6f00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6f10: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
6f20: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
6f30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6f40: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
6f50: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
6f60: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
6f70: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
6f80: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
6f90: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
6fa0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
6fb0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
6fc0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
6fd0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
6fe0: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
6ff0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7000: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7010: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7020: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7030: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7040: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7050: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
7060: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
7070: 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
7080: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7090: 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20  /* Ignore terms 
70a0: 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65  with these prere
70b0: 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  qs */.  struct S
70c0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
70d0: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
70e0: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
70f0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
7100: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
7110: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7120: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7130: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7140: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7150: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7160: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7170: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7180: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7190: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
71a0: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
71b0: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
71c0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
71d0: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
71e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
71f0: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
7200: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
7210: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
7220: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
7230: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
7240: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
7250: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
7260: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
7270: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
7280: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
7290: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
72a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
72b0: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
72c0: 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65  ight & mUnusable
72d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
72e0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
72f0: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
7300: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
7310: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
7320: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7330: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
7340: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7350: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7360: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
7370: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7380: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7390: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
73a0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
73b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
73c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
73d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
73e0: 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
73f0: 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20  QUIV|WO_IS))==0 
7400: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7410: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
7420: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
7430: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7440: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75  assert( pTerm->u
7450: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  .leftColumn>=(-1
7460: 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  ) );.    nTerm++
7470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7480: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7490: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
74a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
74b0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
74c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
74d0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
74e0: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
74f0: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
7500: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7510: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
7520: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
7530: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
7540: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
7550: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
7560: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
7570: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
7580: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7590: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
75a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
75b0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
75c0: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
75d0: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
75e0: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
75f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
7600: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
7610: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
7620: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7630: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7640: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7650: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
7660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7670: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
7680: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
7690: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
76c0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
76d0: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
7700: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
7710: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
7720: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
7730: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7740: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
7750: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
7760: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7770: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7780: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
7790: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
77a0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
77b0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
77c0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
77d0: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
77e0: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
77f0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7800: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7810: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7820: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7830: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7840: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
7850: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
7860: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
7870: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
7880: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7890: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
78a0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
78b0: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
78c0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
78d0: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
78e0: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
78f0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7900: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7910: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7920: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7930: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7940: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
7950: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
7960: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
7970: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
7980: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7990: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
79a0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
79b0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
79c0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
79d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
79e0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
79f0: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7a00: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7a10: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7a20: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7a30: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7a40: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7a50: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
7aa0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7ab0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7ac0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7ad0: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7ae0: 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66     u8 op;.    if
7af0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
7b00: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
7b10: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
7b20: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
7b30: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
7b40: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
7b50: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7b60: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
7b70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7b80: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
7b90: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7ba0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7bb0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
7bc0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7bd0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
7be0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7bf0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7c00: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7c10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7c20: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7c30: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
7c40: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
7c50: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
7c60: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
7c70: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
7c80: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
7c90: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
7ca0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
7cb0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
7cc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
7cd0: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
7ce0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
7cf0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
7d00: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
7d10: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
7d20: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
7d30: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
7d40: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
7d50: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
7d60: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
7d70: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
7d80: 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  WO_MATCH ){.    
7d90: 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d    op = pTerm->eM
7da0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  atchOp;.    }.  
7db0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
7dc0: 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68   = op;.    /* Th
7dd0: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
7de0: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
7df0: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
7e00: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
7e10: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
7e20: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
7e30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
7e40: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
7e50: 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
7e60: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
7e70: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
7e80: 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
7e90: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
7ea0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
7eb0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
7ec0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
7ed0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7ee0: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
7ef0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
7f00: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7f10: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
7f20: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
7f30: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7f40: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
7f50: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
7f60: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7f70: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
7f80: 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
7f90: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7fa0: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
7fb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
7fc0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7fd0: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f   (WO_IN|WO_EQ|WO
7fe0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
7ff0: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
8000: 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
8020: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
8030: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
8040: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8050: 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
8060: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
8070: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
8080: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
8090: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
80a0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
80b0: 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rder;.  }..  ret
80c0: 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a  urn pIdxInfo;.}.
80d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
80e0: 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
80f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
8100: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
8110: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8120: 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65  .** must represe
8130: 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  nt a virtual tab
8140: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
8150: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42  n invokes the xB
8160: 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65  estIndex().** me
8170: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
8180: 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74  ual table with t
8190: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
81a0: 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  _info object tha
81b0: 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73  t.** comes in as
81c0: 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e   the 3rd argumen
81d0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
81e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
81f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50  error occurs, pP
8200: 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65  arse is populate
8210: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
8220: 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a  message and a.**
8230: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
8240: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
8250: 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
8260: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75  urned and the ou
8270: 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20  tput.** part of 
8280: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
8290: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
82a0: 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74   is left populat
82b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  ed..**.** Whethe
82c0: 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
82d0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
82e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
82f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
8300: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
8310: 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
8320: 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
8330: 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
8340: 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
8350: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
8360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
8370: 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
8380: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
8390: 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
83a0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
83b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
83c0: 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
83d0: 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
83e0: 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
83f0: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
8400: 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f  nt rc;..  TRACE_
8410: 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
8420: 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
8430: 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
8440: 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
8450: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
8460: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
8470: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8480: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
8490: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
84a0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50  lite3OomFault(pP
84b0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  arse->db);.    }
84c0: 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
84d0: 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
84e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
84f0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
8500: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
8510: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
8520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8540: 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
8550: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
8560: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
8570: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
8580: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
8590: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
85a0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
85b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
85c0: 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
85d0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
85e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
85f0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
8600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8610: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8620: 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
8630: 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
8640: 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
8650: 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
8660: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
8670: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
8680: 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
8690: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
86a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
86b0: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
86c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
86d0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
86e0: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
86f0: 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
8700: 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
8710: 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
8720: 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
8730: 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
8740: 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
8750: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
8760: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
8770: 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
8780: 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
8790: 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74  pRec.**    aStat
87a0: 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
87b0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
87c0: 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a  al to pRec.**.**
87d0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
87e0: 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
87f0: 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
8800: 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
8810: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
8820: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8830: 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20  pRec. Note that 
8840: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  this index is no
8850: 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e  t an index.** in
8860: 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  to the aSample[]
8870: 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61   array - it is a
8880: 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76  n index into a v
8890: 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61  irtual set of sa
88a0: 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f  mples.** based o
88b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
88c0: 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20  f aSample[] and 
88d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
88e0: 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a  elds in record .
88f0: 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61  ** pRec. .*/.sta
8900: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
8910: 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
8920: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8930: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
8950: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8970: 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
8980: 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
8990: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
89a0: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
89b0: 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
89c0: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
89d0: 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89f0: 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
8a00: 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
8a10: 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
8a20: 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
8a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8a40: 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
8a50: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
8a60: 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
8a70: 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
8a80: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
8ab0: 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
8ac0: 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
8ad0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8af0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d  dex of first sam
8b00: 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20  ple >= pRec */. 
8b10: 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20   int iSample;   
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b30: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8b40: 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65  larger than or e
8b50: 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
8b60: 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b80: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
8b90: 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
8ba0: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
8bd0: 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
8be0: 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
8bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
8c00: 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
8c10: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
8c20: 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8c40: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
8c50: 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f  in pRec */.  tRo
8c60: 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
8c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74           /* anLt
8c80: 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c  [] + anEq[] of l
8c90: 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52  argest sample pR
8ca0: 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e  ec is > */..#ifn
8cb0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8cc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8cd0: 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23  TER( pParse );.#
8ce0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
8cf0: 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRec!=0 );.  ass
8d00: 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
8d10: 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
8d20: 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
8d30: 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64   && pRec->nField
8d40: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  <=pIdx->nSampleC
8d50: 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61  ol );..  /* Do a
8d60: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
8d70: 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  o find the first
8d80: 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20   sample greater 
8d90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
8da0: 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70  ** to pRec. If p
8db0: 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  Rec contains a s
8dc0: 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65  ingle field, the
8dd0: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20   set of samples 
8de0: 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69  to search.  ** i
8df0: 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61  s simply the aSa
8e00: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66  mple[] array. If
8e10: 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20   the samples in 
8e20: 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69  aSample[] contai
8e30: 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e  n more.  ** than
8e40: 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c   one fields, all
8e50: 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e   fields followin
8e60: 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  g the first are 
8e70: 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  ignored..  **.  
8e80: 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  ** If pRec conta
8e90: 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68  ins N fields, wh
8ea0: 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68  ere N is more th
8eb0: 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20  an one, then as 
8ec0: 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a  well as the.  **
8ed0: 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d   samples in aSam
8ee0: 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64  ple[] (truncated
8ef0: 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74   to N fields), t
8f00: 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68  he search also h
8f10: 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69  as to.  ** consi
8f20: 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20  der prefixes of 
8f30: 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46  those samples. F
8f40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
8f50: 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
8f60: 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c  s.  ** in aSampl
8f70: 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e is:.  **.  ** 
8f80: 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d      aSample[0] =
8f90: 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
8fa0: 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28    aSample[1] = (
8fb0: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
8fc0: 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62   aSample[2] = (b
8fd0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
8fe0: 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20  Sample[3] = (c, 
8ff0: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  100) .  **     a
9000: 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20  Sample[4] = (c, 
9010: 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  105).  **.  ** T
9020: 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73  hen the search s
9030: 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61  pace should idea
9040: 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c  lly be the sampl
9050: 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65  es above and the
9060: 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72   .  ** unique pr
9070: 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20  efixes [a], [b] 
9080: 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e  and [c]. But sin
9090: 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20  ce that is hard 
90a0: 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20  to organize, .  
90b0: 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75  ** the code actu
90c0: 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68  ally searches th
90d0: 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a  is set:.  **.  *
90e0: 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20  *     0: (a) .  
90f0: 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29  **     1: (a, 5)
9100: 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61   .  **     2: (a
9110: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
9120: 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  3: (a, 10) .  **
9130: 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a       4: (b) .  *
9140: 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20  *     5: (b, 5) 
9150: 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29  .  **     6: (c)
9160: 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63   .  **     7: (c
9170: 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
9180: 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   8: (c, 105).  *
9190: 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35  *     9: (c, 105
91a0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ).  **.  ** For 
91b0: 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74  each sample in t
91c0: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
91d0: 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72  ay, N samples ar
91e0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
91f0: 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20  .  ** effective 
9200: 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e  sample array. In
9210: 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70   the above, samp
9220: 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20  les 0 and 1 are 
9230: 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73  based on .  ** s
9240: 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d  ample aSample[0]
9250: 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20  . Samples 2 and 
9260: 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20  3 on aSample[1] 
9270: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  etc..  **.  ** O
9280: 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f  ften, sample i o
9290: 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20  f each block of 
92a0: 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  N effective samp
92b0: 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69  les has (i+1) fi
92c0: 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70  elds..  ** Excep
92d0: 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d  t, each sample m
92e0: 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  ay be extended t
92f0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74  o ensure that it
9300: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9310: 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74   or.  ** equal t
9320: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  o the previous s
9330: 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72  ample in the arr
9340: 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ay. For example,
9350: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a   in the above, .
9360: 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73    ** sample 2 is
9370: 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
9380: 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20  e of a block of 
9390: 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74  N samples, so at
93a0: 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20   first it .  ** 
93b0: 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
93c0: 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c  should be 1 fiel
93d0: 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76  d in size. Howev
93e0: 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  er, that would m
93f0: 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61  ake it .  ** sma
9400: 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
9410: 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72   1, so the binar
9420: 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e  y search would n
9430: 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65  ot work. As a re
9440: 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69  sult, .  ** it i
9450: 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77  s extended to tw
9460: 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75  o fields. The du
9470: 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68  plicates that th
9480: 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f  is creates do no
9490: 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  t .  ** cause an
94a0: 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
94b0: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63  .  nField = pRec
94c0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c  ->nField;.  iCol
94d0: 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20   = 0;.  iSample 
94e0: 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  = pIdx->nSample 
94f0: 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a  * nField;.  do{.
9500: 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20      int iSamp;  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53    /* Index in aS
9530: 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20  ample[] of test 
9540: 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  sample */.    in
9550: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
9560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9570: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
9580: 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  in test sample *
9590: 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  /..    iTest = (
95a0: 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b  iMin+iSample)/2;
95b0: 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65  .    iSamp = iTe
95c0: 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20  st / nField;.   
95d0: 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a   if( iSamp>0 ){.
95e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
95f0: 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20  posed effective 
9600: 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66  sample is a pref
9610: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61  ix of sample aSa
9620: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20  mple[iSamp]..   
9630: 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c     ** Specifical
9640: 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74  ly, the shortest
9650: 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65   prefix of at le
9660: 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e  ast (1 + iTest%n
9670: 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a  Field) .      **
9680: 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20   fields that is 
9690: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
96a0: 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74   previous effect
96b0: 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a  ive sample.  */.
96c0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65        for(n=(iTe
96d0: 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31  st % nField) + 1
96e0: 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29  ; n<nField; n++)
96f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
9700: 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61  ample[iSamp-1].a
9710: 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c  nLt[n-1]!=aSampl
9720: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9730: 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1] ) break;.    
9740: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9750: 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b       n = iTest +
9760: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
9770: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b  Rec->nField = n;
9780: 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
9790: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
97a0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d  are(aSample[iSam
97b0: 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53  p].n, aSample[iS
97c0: 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20  amp].p, pRec);. 
97d0: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
97e0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
97f0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9800: 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c  Lt[n-1] + aSampl
9810: 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d  e[iSamp].anEq[n-
9820: 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
9830: 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
9840: 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26  lse if( res==0 &
9850: 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20  & n<nField ){.  
9860: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
9870: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
9880: 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
9890: 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
98a0: 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
98b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53   }else{.      iS
98c0: 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20  ample = iTest;. 
98d0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b       iCol = n-1;
98e0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
98f0: 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61   res && iMin<iSa
9900: 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53  mple );.  i = iS
9910: 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a  ample / nField;.
9920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9930: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f  EBUG.  /* The fo
9940: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
9950: 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20  tatements check 
9960: 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20  that the binary 
9970: 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a  search code.  **
9980: 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65   above found the
9990: 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54   right answer. T
99a0: 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
99b0: 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65   no purpose othe
99c0: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69  r.  ** than to i
99d0: 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74  nvoke the assert
99e0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
99f0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9a00: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
9a10: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
9a20: 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
9a30: 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
9a40: 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71   pRec must be eq
9a50: 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e  ual to sample i.
9a60: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9a70: 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
9a80: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9a90: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
9aa0: 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  1 );.      pRec-
9ab0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
9ac0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ad0: 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65  0==sqlite3VdbeRe
9ae0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9af0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
9b00: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20  e[i].p, pRec) . 
9b10: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9b20: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9b30: 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a  ailed .      );.
9b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b50: 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49   /* Unless i==pI
9b60: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64  dx->nSample, ind
9b70: 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65  icating that pRe
9b80: 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  c is larger than
9b90: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61  .      ** all sa
9ba0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61  mples in the aSa
9bb0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52  mple[] array, pR
9bc0: 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c  ec must be small
9bd0: 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
9be0: 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69    ** (iCol+1) fi
9bf0: 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
9c00: 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20  mple i.  */.    
9c10: 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64    assert( i<=pId
9c20: 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e  x->nSample && i>
9c30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  =0 );.      pRec
9c40: 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b  ->nField = iCol+
9c50: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
9c60: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
9c70: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  e .           ||
9c80: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9c90: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9ca0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9cb0: 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
9cc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9cd0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9ce0: 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f  iled );..      /
9cf0: 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43  * if i==0 and iC
9d00: 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f  ol==0, then reco
9d10: 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c  rd pRec is small
9d20: 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70  er than all samp
9d30: 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  les.      ** in 
9d40: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9d50: 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
9d60: 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e  if (iCol>0) then
9d70: 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20   pRec must.     
9d80: 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74   ** be greater t
9d90: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
9da0: 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64  the (iCol) field
9db0: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9dc0: 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  e i..      ** If
9dd0: 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65   (i>0), then pRe
9de0: 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67  c must also be g
9df0: 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70  reater than samp
9e00: 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  le (i-1).  */.  
9e10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
9e20: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
9e30: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20  nField = iCol;. 
9e40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9e50: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9e60: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9e70: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
9e80: 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20  .p, pRec)<=0.   
9e90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9ea0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9eb0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
9ec0: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29  .      if( i>0 )
9ed0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
9ee0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9ef0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9f00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9f10: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9f20: 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c  e[i-1].n, aSampl
9f30: 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c  e[i-1].p, pRec)<
9f40: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
9f50: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9f60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9f80: 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
9f90: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
9fa0: 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
9fb0: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70  .    /* Record p
9fc0: 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Rec is equal to 
9fd0: 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20  sample i */.    
9fe0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
9ff0: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53  ield-1 );.    aS
a000: 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
a010: 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
a020: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
a030: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
a040: 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
a050: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
a060: 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31  int, the (iCol+1
a070: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
a080: 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20  f aSample[i] is 
a090: 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a  the first .    *
a0a0: 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  * sample that is
a0b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52   greater than pR
a0c0: 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49  ec. Or, if i==pI
a0d0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e  dx->nSample then
a0e0: 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20   pRec.    ** is 
a0f0: 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
a100: 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
a110: 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f  rray. */.    tRo
a120: 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61  wcnt iUpper, iGa
a130: 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49  p;.    if( i>=pI
a140: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  dx->nSample ){. 
a150: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71       iUpper = sq
a160: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
a170: 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
a180: 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  st[0]);.    }els
a190: 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  e{.      iUpper 
a1a0: 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
a1b0: 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a  t[iCol];.    }..
a1c0: 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
a1d0: 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
a1e0: 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
a1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
a200: 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
a210: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
a220: 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
a230: 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
a240: 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
a250: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
a260: 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
a270: 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
a280: 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74   + iGap;.    aSt
a290: 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41  at[1] = pIdx->aA
a2a0: 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a  vgEq[iCol];.  }.
a2b0: 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
a2c0: 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76  e pRec->nField v
a2d0: 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
a2e0: 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65  rning.  */.  pRe
a2f0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
a300: 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  ld;.  return i;.
a310: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a320: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
a330: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
a340: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
a350: 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61  NULL, pTerm is a
a360: 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69   term that provi
a370: 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20  des an upper or 
a380: 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f  lower.** bound o
a390: 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20  n a range scan. 
a3a0: 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72  Without consider
a3b0: 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73  ing pTerm, it is
a3c0: 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74   estimated .** t
a3d0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c  hat the scan wil
a3e0: 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77  l visit nNew row
a3f0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
a400: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
a410: 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ber.** estimated
a420: 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61   to be visited a
a430: 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72  fter taking pTer
a440: 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a  m into account..
a450: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
a460: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  r explicitly spe
a470: 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68  cified a likelih
a480: 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20  ood() value for 
a490: 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68  this term,.** th
a4a0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
a4b0: 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c  lue is the likel
a4c0: 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64  ihood multiplied
a4d0: 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
a4e0: 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e  f.** input rows.
a4f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
a500: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
a510: 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f  s that an "IS NO
a520: 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20  T NULL" term.** 
a530: 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  has a likelihood
a540: 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e   of 0.50, and an
a550: 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c  y other term a l
a560: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32  ikelihood of 0.2
a570: 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  5..*/.static Log
a580: 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64  Est whereRangeAd
a590: 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a  just(WhereTerm *
a5a0: 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e  pTerm, LogEst nN
a5b0: 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52  ew){.  LogEst nR
a5c0: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28  et = nNew;.  if(
a5d0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
a5e0: 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
a5f0: 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ob<=0 ){.      n
a600: 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Ret += pTerm->tr
a610: 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c  uthProb;.    }el
a620: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77  se if( (pTerm->w
a630: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
a640: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
a650: 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20   nRet -= 20;    
a660: 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
a670: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
a680: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
a690: 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
a6a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a6b0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
a6c0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TAT4./*.** Retur
a6d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66  n the affinity f
a6e0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  or a single colu
a6f0: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a  mn of an index..
a700: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73  */.static char s
a710: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
a720: 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65  nAffinity(sqlite
a730: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
a740: 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  dx, int iCol){. 
a750: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
a760: 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
a770: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20  Column );.  if( 
a780: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
a790: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
a7a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
a7b0: 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29  r(db, pIdx)==0 )
a7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
a7d0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72  FF_BLOB;.  }.  r
a7e0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c  eturn pIdx->zCol
a7f0: 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e  Aff[iCol];.}.#en
a800: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
a810: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a820: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
a830: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a840: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
a850: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
a860: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
a870: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
a880: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
a890: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
a8a0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
a8b0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
a8c0: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
a8d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
a8e0: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
a8f0: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
a900: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
a910: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
a920: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
a930: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
a940: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
a950: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
a960: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
a970: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
a980: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
a990: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
a9a0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
a9b0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
a9c0: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
a9d0: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
a9e0: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
a9f0: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
aa00: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
aa10: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
aa20: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
aa30: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
aa40: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
aa50: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
aa60: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
aa70: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
aa80: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
aa90: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
aaa0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
aab0: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
aac0: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
aad0: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
aae0: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
aaf0: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
ab00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
ab10: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
ab20: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
ab30: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
ab40: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
ab50: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
ab60: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
ab70: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
ab80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
ab90: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
aba0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
abb0: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
abc0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
abd0: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
abe0: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
abf0: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
ac00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
ac10: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
ac20: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
ac30: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
ac40: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
ac50: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
ac60: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
ac70: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
ac80: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
ac90: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
aca0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
acb0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
acc0: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
acd0: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
ace0: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
acf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ad00: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
ad10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
ad20: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
ad30: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
ad40: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
ad50: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
ad60: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
ad70: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
ad80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ad90: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
ada0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
adb0: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
adc0: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
add0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
ade0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
adf0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
ae00: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
ae10: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
ae20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae30: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
ae40: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
ae50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
ae60: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
ae70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
ae80: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
ae90: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
aea0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
aeb0: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
aec0: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
aed0: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
aee0: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
aef0: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
af00: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
af10: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
af20: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
af30: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
af40: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
af50: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
af60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
af70: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
af80: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
af90: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
afa0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
afb0: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
afc0: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
afd0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
afe0: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
aff0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
b000: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b010: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b020: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
b030: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
b040: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
b050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b060: 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69  .  u8 aff = sqli
b070: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
b080: 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45  finity(db, p, nE
b090: 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  q);.  CollSeq *p
b0a0: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
b0b0: 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
b0c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
b0d0: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b0e0: 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
b0f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
b100: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
b110: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
b120: 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
b130: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b140: 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
b150: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b160: 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
b170: 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
b180: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
b190: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b1a0: 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
b1b0: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
b1c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b1d0: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b1e0: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
b1f0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b200: 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
b210: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
b220: 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
b230: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b250: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b260: 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
b270: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b280: 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
b290: 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
b2a0: 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
b2b0: 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
b2c0: 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
b2d0: 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
b2e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
b2f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
b300: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
b310: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
b320: 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
b330: 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
b340: 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
b350: 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
b360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
b380: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b390: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
b3a0: 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
b3b0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
b3c0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
b3d0: 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
b3e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b3f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
b400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b410: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
b420: 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
b430: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
b440: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
b450: 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
b460: 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
b470: 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
b480: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
b490: 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
b4a0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b4b0: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
b4c0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
b4d0: 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
b4e0: 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
b4f0: 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
b500: 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
b510: 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
b520: 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
b530: 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
b540: 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
b550: 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
b560: 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
b570: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
b580: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
b590: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
b5a0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
b5b0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
b5c0: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
b5d0: 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
b5e0: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
b5f0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
b600: 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
b610: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
b620: 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
b630: 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
b640: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
b650: 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
b660: 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
b670: 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
b680: 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
b690: 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
b6a0: 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
b6b0: 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
b6c0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
b6d0: 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
b6e0: 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
b6f0: 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
b700: 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
b730: 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
b740: 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
b750: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
b760: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
b770: 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
b780: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
b790: 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
b7a0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
b7b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b7c0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
b7d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
b7e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
b7f0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
b800: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
b810: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b820: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
b830: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b840: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
b850: 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
b860: 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
b870: 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
b880: 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
b890: 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
b8a0: 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
b8b0: 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
b8c0: 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
b8d0: 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
b8e0: 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
b8f0: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
b900: 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
b910: 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
b920: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
b930: 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
b940: 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
b950: 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
b960: 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
b970: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
b980: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
b990: 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
b9b0: 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
b9e0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
b9f0: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
ba00: 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
ba10: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
ba20: 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
ba30: 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
ba40: 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
ba50: 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
ba60: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
ba70: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
ba80: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
ba90: 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
baa0: 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
bab0: 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e  ee.nEq) is the n
bac0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
bad0: 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62  ex.** column sub
bae0: 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67  ject to the rang
baf0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
bb00: 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
bb10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
bb20: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
bb30: 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20  aints optimized 
bb40: 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
bb50: 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
bb60: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75  example,.** assu
bb70: 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20  ming index p is 
bb80: 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
bb90: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
bba0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
bbb0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
bbc0: 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
bbd0: 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
bbe0: 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
bbf0: 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61   to 1 (as the ra
bc00: 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
bc10: 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65  olumn, b, is the
bc20: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74   second .** left
bc30: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
bc40: 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
bc50: 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
bc60: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
bc70: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
bc80: 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
bc90: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
bca0: 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
bcb0: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
bcc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
bcd0: 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
bce0: 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  the sqlite3LogEs
bcf0: 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
bd00: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
bd10: 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
bd20: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
bd30: 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
bd40: 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
bd50: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
bd60: 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
bd70: 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73  , then *pnOut is
bd80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
bd90: 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
bda0: 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
bdb0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
bdc0: 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
bdd0: 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
bde0: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
bdf0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
be00: 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
be10: 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
be20: 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
be30: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
be40: 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
be50: 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
be60: 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61  ot be.** used, a
be70: 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e   single range in
be80: 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
be90: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
bea0: 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
beb0: 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61   4. .** and a pa
bec0: 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
bed0: 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
bee0: 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
bef0: 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
bf00: 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
bf10: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34  y a factor of 64
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf30: 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
bf40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bf50: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
bf60: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
bf70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
bf80: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
bf90: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
bfa0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
bfb0: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
bfc0: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
bfd0: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
bfe0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
bff0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
c000: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
c010: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
c020: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
c030: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c040: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
c050: 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
c060: 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
c070: 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
c080: 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
c090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c0a0: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
c0b0: 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
c0c0: 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
c0d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c0e0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
c0f0: 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
c100: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
c110: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
c120: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
c130: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
c140: 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e  ple>0 && nEq<p->
c150: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20  nSampleCol ){.  
c160: 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
c170: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
c180: 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
c190: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
c1a0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
c1b0: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
c1c0: 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
c1d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
c1e0: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
c1f0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
c200: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
c210: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c220: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
c230: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
c240: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
c250: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
c260: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
c270: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
c280: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
c290: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
c2a0: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
c2b0: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
c2c0: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
c2d0: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
c2e0: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
c2f0: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
c300: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
c310: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
c320: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
c330: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
c340: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
c350: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
c360: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
c370: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
c380: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
c390: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
c3a0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
c3b0: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
c3c0: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
c3d0: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
c3e0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
c3f0: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
c400: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
c410: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
c420: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
c430: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
c440: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
c450: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
c460: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
c470: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
c480: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
c490: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
c4a0: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
c4b0: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
c4c0: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
c4d0: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
c4e0: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
c4f0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
c500: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
c510: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
c520: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
c530: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
c540: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
c550: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
c560: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
c570: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
c580: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
c590: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
c5a0: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
c5b0: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
c5c0: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
c5d0: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
c5e0: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
c5f0: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
c600: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c610: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
c620: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
c630: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
c640: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
c650: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
c660: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
c670: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
c680: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
c690: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
c6a0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c6b0: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
c6c0: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c6d0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
c6e0: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
c6f0: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
c700: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
c710: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
c720: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
c730: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
c740: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
c750: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
c760: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
c770: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c780: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
c790: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c7a0: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
c7b0: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
c7c0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7e0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  aff = sqlite3Ind
c7f0: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
c800: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
c810: 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nEq);.      asse
c820: 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79  rt( nEq!=p->nKey
c830: 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  Col || aff==SQLI
c840: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
c850: 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ;.      /* Deter
c860: 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20  mine iLower and 
c870: 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50  iUpper using ($P
c880: 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  ) only. */.     
c890: 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20   if( nEq==0 ){. 
c8a0: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
c8b0: 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  0;.        iUppe
c8c0: 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b  r = p->nRowEst0;
c8d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c8e0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
c8f0: 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
c900: 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
c910: 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
c920: 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
c930: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62         ** have b
c940: 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
c950: 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
c960: 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
c970: 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
c980: 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
c990: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
c9a0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
c9b0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
c9c0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ];.        iUppe
c9d0: 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
c9e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c9f0: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d  assert( pLower==
ca00: 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  0 || (pLower->eO
ca10: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
ca20: 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
ca30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70       assert( pUp
ca40: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
ca50: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
ca60: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
ca70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ca80: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  ( p->aSortOrder!
ca90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
caa0: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  p->aSortOrder[nE
cab0: 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  q] ){.        /*
cac0: 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c   The roles of pL
cad0: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
cae0: 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20  are swapped for 
caf0: 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a  a DESC index */.
cb00: 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65          SWAP(Whe
cb10: 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c  reTerm*, pLower,
cb20: 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20   pUpper);.      
cb30: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
cb40: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
cb50: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
cb60: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
cb70: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
cb80: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
cb90: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
cbc0: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
cbd0: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
cbe0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
cbf0: 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
cc00: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
cc10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cc20: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
cc30: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
cc40: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
cc50: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
cc60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cc70: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
cc80: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
cc90: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
cca0: 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72    iLwrIdx = wher
ccb0: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
ccc0: 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
ccd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
cce0: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
ccf0: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
cd00: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
cd10: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
cd20: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
cd30: 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
cd40: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cd50: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
cd60: 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     pLower = 0;. 
cd70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cd80: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
cd90: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
cda0: 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
cdb0: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
cdc0: 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$U). */.      i
cdd0: 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
cde0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
ce10: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ce20: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
ce30: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
ce40: 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
ce50: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
ce60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
ce70: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
ce80: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
ce90: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cea0: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
ceb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cec0: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
ced0: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cee0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cef0: 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65   iUprIdx = where
cf00: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cf10: 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
cf20: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cf30: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
cf40: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
cf50: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
cf60: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
cf70: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
cf80: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
cf90: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
cfa0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
cfb0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
cfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cfd0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
cfe0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
cff0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d000: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d010: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
d020: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
d030: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
d040: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
d050: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
d060: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
d070: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
d080: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
d090: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
d0a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
d0b0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
d0c0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
d0d0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
d0e0: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
d0f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
d100: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
d110: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
d120: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
d130: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
d140: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
d150: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
d160: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
d170: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
d180: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
d190: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
d1a0: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
d1b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
d1e0: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
d1f0: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
d200: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
d210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d220: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
d230: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
d240: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
d250: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
d260: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
d270: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
d280: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
d290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
d2b0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
d2c0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
d2d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d2e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
d2f0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
d300: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
d310: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
d320: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
d330: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
d340: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
d350: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d360: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d370: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d380: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
d390: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
d3a0: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
d3b0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
d3c0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
d3d0: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
d3e0: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
d3f0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
d400: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
d410: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
d420: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
d430: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
d440: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
d450: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
d460: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
d470: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
d480: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
d490: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
d4a0: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
d4b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
d4c0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
d4d0: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
d4e0: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
d4f0: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
d500: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
d510: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
d520: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
d530: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
d540: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
d550: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
d560: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
d570: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
d580: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
d590: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
d5a0: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
d5b0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
d5c0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
d5d0: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
d5e0: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
d5f0: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
d600: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
d610: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
d620: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
d630: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
d640: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
d650: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
d660: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
d670: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
d680: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
d690: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
d6a0: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
d6b0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d6c0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
d6d0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
d6e0: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
d6f0: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
d700: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
d710: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
d720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d730: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
d740: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
d750: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
d760: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
d770: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
d780: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d790: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d7a0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
d7b0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
d7c0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
d7d0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
d7e0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
d7f0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d800: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
d810: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
d820: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
d830: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
d840: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
d850: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
d860: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
d870: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
d880: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
d890: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
d8a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
d8b0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
d8c0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
d8d0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
d8e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
d8f0: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
d900: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
d910: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
d920: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
d930: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
d940: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
d950: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
d960: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
d970: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
d980: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
d990: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
d9a0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
d9b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d9c0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
d9d0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
d9e0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
d9f0: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
da00: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
da10: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
da20: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
da30: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
da40: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
da50: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
da60: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
da70: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
da80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
da90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
daa0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
dab0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
dac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
dad0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
dae0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
daf0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
db00: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
db10: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
db20: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
db30: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
db40: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
db50: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
db60: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
db70: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
db80: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
db90: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
dba0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
dbb0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
dbc0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
dbd0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
dbe0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
dbf0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
dc00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
dc10: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
dc20: 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b  >pRec;.  u8 aff;
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
dc50: 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
dc60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
dc70: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
dc80: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
dc90: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
dca0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
dcb0: 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
dcc0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
dcd0: 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
dce0: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70    assert( nEq<=p
dcf0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
dd00: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
dd10: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
dd20: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
dd30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
dd40: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
dd50: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
dd60: 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
dd70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
dd80: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
dd90: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
dda0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
ddb0: 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
ddc0: 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
ddd0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
dde0: 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
ddf0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
de00: 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de20: 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
de30: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
de40: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
de50: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
de60: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
de70: 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
de80: 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
de90: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
dea0: 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70   */.  if( nEq>=p
deb0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
dec0: 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
ded0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dee0: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
def0: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
df00: 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  mnAffinity(pPars
df10: 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29  e->db, p, nEq-1)
df20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
df30: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
df40: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
df50: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
df60: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
df70: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
df80: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
df90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
dfa0: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
dfb0: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
dfc0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
dfd0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
dfe0: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
dff0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
e000: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
e010: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
e020: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
e030: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
e040: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
e070: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
e080: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
e090: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
e0a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e0b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e0c0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
e0d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e0e0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
e0f0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
e100: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e110: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
e120: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
e130: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
e140: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
e150: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e160: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
e170: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
e180: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
e190: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
e1a0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
e1b0: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
e1c0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
e1d0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
e1e0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
e1f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
e200: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
e210: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
e220: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
e230: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
e240: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
e250: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e260: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
e270: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
e280: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
e290: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
e2a0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
e2b0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
e2c0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
e2d0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
e2e0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
e2f0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
e300: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
e310: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
e320: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
e330: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
e340: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
e350: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
e360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e370: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
e380: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
e390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e3a0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
e3b0: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
e3c0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e3d0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
e3e0: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
e3f0: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
e400: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
e410: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
e420: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
e430: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
e440: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
e450: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
e460: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e470: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
e480: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
e490: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
e4a0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
e4b0: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
e4c0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e4d0: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
e4e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e4f0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
e500: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e510: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
e520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e530: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
e540: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
e550: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
e560: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
e570: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
e580: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
e590: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e5b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e5c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
e5d0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
e5e0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e5f0: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
e600: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e610: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
e620: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
e630: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
e640: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
e650: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
e660: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
e670: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
e680: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e690: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
e6a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
e6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e6c0: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
e6d0: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
e6e0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
e6f0: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
e700: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
e710: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
e720: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
e730: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
e740: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
e750: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
e760: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
e770: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e780: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e790: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e7a0: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
e7b0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
e7c0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
e7d0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
e7e0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
e7f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
e800: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
e810: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
e820: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
e830: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
e840: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e850: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
e860: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
e870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
e880: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d   zType[4];.    m
e890: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
e8a0: 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  .", 4);.    if( 
e8b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
e8c0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
e8d0: 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a  zType[0] = 'V';.
e8e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
e8f0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
e900: 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
e910: 3d 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45  = 'E';.    if( E
e920: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e930: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
e940: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70  FromJoin) ) zTyp
e950: 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20  e[2] = 'L';.    
e960: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e970: 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
e980: 2d 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73  -%-3d %p %s curs
e990: 6f 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33  or=%-3d prob=%-3
e9a0: 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c  d op=0x%03x wtFl
e9b0: 61 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20  ags=0x%04x\n",. 
e9c0: 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
e9d0: 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d  rm, zType, pTerm
e9e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54  ->leftCursor, pT
e9f0: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
ea00: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
ea10: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
ea20: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71  wtFlags);.    sq
ea30: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
ea40: 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
ea50: 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
ea60: 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
ea70: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
ea80: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
ea90: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
eaa0: 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
eab0: 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
eac0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
ead0: 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
eae0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
eaf0: 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
eb00: 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
eb10: 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
eb20: 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
eb30: 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
eb40: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
eb50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
eb60: 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
eb70: 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
eb80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
eb90: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
eba0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ebb0: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
ebc0: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ebe0: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
ebf0: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
ec00: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
ec10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ec20: 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
ec50: 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
ec60: 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
ec70: 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
ec80: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
ec90: 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
eca0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ecb0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
ecc0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
ecd0: 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
ece0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
ecf0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ed00: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
ed10: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
ed20: 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
ed30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
ed40: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
ed50: 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
ed60: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
ed70: 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
ed80: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
ed90: 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
eda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
edb0: 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
edc0: 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
edd0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
ede0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edf0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ee00: 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
ee10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ee20: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
ee30: 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
ee40: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
ee50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ee60: 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
ee70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ee80: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
ee90: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
eea0: 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
eeb0: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
eec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
eed0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
eee0: 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
eef0: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
ef00: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
ef10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ef20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ef30: 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
ef40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ef50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
ef60: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ef70: 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
ef80: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ef90: 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
efa0: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
efb0: 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
efc0: 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
efd0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
efe0: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
eff0: 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
f000: 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
f010: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f020: 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
f030: 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
f040: 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
f050: 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
f060: 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
f070: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
f080: 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
f090: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f0a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
f0b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
f0c0: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
f0d0: 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
f0e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
f0f0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
f100: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
f110: 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
f120: 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
f130: 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
f140: 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
f150: 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
f160: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f170: 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
f180: 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
f190: 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
f1a0: 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
f1b0: 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
f1c0: 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
f1d0: 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
f1e0: 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
f1f0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
f200: 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
f210: 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
f220: 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
f230: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
f240: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
f250: 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
f260: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
f270: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
f280: 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
f290: 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
f2a0: 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
f2b0: 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
f2c0: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
f2d0: 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
f2e0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
f2f0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
f300: 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
f310: 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
f320: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
f330: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
f340: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
f350: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
f360: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
f370: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
f380: 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
f390: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
f3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f3b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
f3c0: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
f3d0: 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
f3e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f3f0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
f400: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
f410: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
f420: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f430: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
f440: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
f450: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
f460: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
f470: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f480: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
f490: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
f4a0: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
f4b0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f4c0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f4d0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f4e0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
f4f0: 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
f500: 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
f510: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
f520: 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
f530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
f540: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
f550: 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
f560: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f570: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
f580: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
f590: 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
f5a0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
f5b0: 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
f5c0: 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
f5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f5e0: 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
f5f0: 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
f600: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
f610: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
f620: 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28  rm[0])*n);.  if(
f630: 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75   paNew==0 ) retu
f640: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
f650: 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70  BKPT;.  memcpy(p
f660: 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
f670: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
f680: 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
f690: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
f6a0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f6b0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f6c0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f6d0: 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
f6e0: 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
f6f0: 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
f700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f710: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
f720: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
f730: 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
f740: 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
f750: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
f760: 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
f770: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f780: 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
f790: 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
f7a0: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f7b0: 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
f7c0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
f7d0: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
f7e0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
f7f0: 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
f800: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
f810: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f820: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f830: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
f840: 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
f850: 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
f860: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
f870: 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
f880: 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
f890: 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
f8a0: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
f8b0: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f8c0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f8d0: 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
f8e0: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
f8f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
f900: 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
f910: 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
f920: 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
f930: 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
f940: 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
f950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
f970: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f980: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
f990: 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
f9a0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
f9b0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f9c0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
f9d0: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
f9e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
f9f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
fa00: 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
fa10: 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
fa20: 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
fa30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fa40: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
fa50: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
fa60: 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
fa70: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
fa80: 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
fa90: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
faa0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
fab0: 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
fac0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i];.      if( pL
fad0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20  evel->pWLoop && 
fae0: 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
faf0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
fb00: 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20  _IN_ABLE) ){.   
fb10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fb20: 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
fb30: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
fb40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fb50: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
fb60: 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
fb70: 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
fb80: 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
fb90: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
fba0: 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
fbb0: 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
fbc0: 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
fbd0: 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
fbe0: 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
fbf0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
fc00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
fc10: 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
fc20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
fc30: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
fc40: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fc50: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
fc60: 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
fc70: 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
fc80: 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
fc90: 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
fca0: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
fcb0: 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69  .**   (3)  X ski
fcc0: 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  ps at least as m
fcd0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59  any columns as Y
fce0: 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
fcf0: 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
fd00: 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
fd10: 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
fd20: 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
fd30: 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
fd40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fd50: 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
fd60: 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
fd70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
fd80: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
fd90: 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
fda0: 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
fdb0: 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
fdc0: 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
fdd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
fde0: 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
fdf0: 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
fe00: 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
fe10: 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
fe20: 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
fe30: 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75  d.  The third ru
fe40: 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  le.** was added 
fe50: 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
fe60: 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
fe70: 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
fe80: 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
fe90: 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
fea0: 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
feb0: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
fec0: 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
fed0: 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
fee0: 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
fef0: 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
ff00: 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
ff10: 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
ff20: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
ff30: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
ff40: 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
ff50: 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
ff60: 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
ff70: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
ff80: 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
ff90: 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
ffa0: 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
ffb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ffc0: 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
ffd0: 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
ffe0: 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
fff0: 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
10000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10010 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
10020 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
10030 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
10040 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
10050 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
10060 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
10070 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
10080 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
10090 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
100a0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
100b0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
100c0 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
100d0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
100e0 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
100f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
10100 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
10110 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
10120 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
10130 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
10140 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
10150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10160 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
10170 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
10180 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
10190 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
101a0 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
101b0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
101c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
101d0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
101e0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
101f0 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
10200 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
10210 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
10220 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
10230 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
10240 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
10250 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
10260 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
10270 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
10280 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
10290 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
102a0 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
102b0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
102c0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
102d0 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
102e0 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
102f0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10300 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
10310 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
10320 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10330 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
10340 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
10350 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10360 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
10370 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
10380 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
10390 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
103a0 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
103b0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
103c0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
103d0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
103e0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
103f0 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
10400 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
10410 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10420 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
10430 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
10440 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
10450 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
10460 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
10470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10480 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
10490 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
104a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
104b0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
104c0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104d0 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
104e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
104f0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
10500 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
10510 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
10520 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
10530 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
10540 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10550 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10560 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10570 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10580 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10590 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
105a0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
105b0 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
105c0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
105d0 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
105e0 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
105f0 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10600 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10610 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
10620 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
10630 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10640 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
10650 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10660 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10670 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
10680 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
10690 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
106a0 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
106b0 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
106c0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
106d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
106e0 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
106f0 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
10700 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10730 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10740 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
10750 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
10760 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
10770 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
10780 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
10790 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
107a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
107b0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
107c0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
107d0 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
107e0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
107f0 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
10800 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
10810 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
10820 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
10830 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
10840 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
10850 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
10860 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
10870 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
10880 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
10890 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
108a0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
108b0 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
108c0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
108d0 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
108e0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
108f0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
10900 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
10910 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
10920 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
10930 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
10940 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
10950 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
10960 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
10970 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
10980 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
10990 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
109a0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
109b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
109c0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
109d0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
109e0 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
109f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
10a00 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
10a10 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
10a20 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
10a30 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
10a40 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
10a50 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
10a60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
10a70 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
10a80 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
10a90 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
10aa0 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
10ab0 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
10ac0 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
10ad0 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
10ae0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
10af0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
10b00 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
10b10 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
10b20 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
10b30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
10b40 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
10b50 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
10b60 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
10b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
10b80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
10b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
10ba0 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
10bb0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
10bc0 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
10bd0 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
10be0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
10bf0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
10c00 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
10c10 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
10c20 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
10c30 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
10c40 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
10c50 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
10c60 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
10c70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
10c80 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
10c90 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
10ca0 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
10cb0 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
10cc0 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
10cd0 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
10ce0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
10cf0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
10d00 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
10d10 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
10d20 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
10d30 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
10d40 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
10d50 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
10d60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10d70 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
10d80 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10d90 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
10da0 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
10db0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
10dc0 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
10dd0 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
10de0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
10df0 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
10e00 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
10e10 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
10e20 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
10e30 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
10e40 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
10e50 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
10e60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10e70 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
10e80 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
10e90 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
10ea0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10eb0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
10ec0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
10ed0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10ee0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
10ef0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
10f00 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
10f10 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
10f20 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
10f30 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
10f40 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
10f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10f60 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
10f70 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
10f80 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
10f90 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
10fa0 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
10fb0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
10fc0 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
10fd0 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
10fe0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
10ff0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
11000 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
11010 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
11020 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
11030 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
11040 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
11050 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
11060 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
11070 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
11080 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
11090 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
110a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
110b0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
110c0 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
110d0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
110e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
11110 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
11120 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
11150 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
11160 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
11170 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
11180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11190 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
111a0 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
111b0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
111c0 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
111d0 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
111e0 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
111f0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
11200 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
11210 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
11220 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
11230 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
11240 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
11250 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
11260 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
11270 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
11280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11290 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
112a0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
112b0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
112c0 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
112d0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
112e0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
112f0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11310 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
11320 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
11330 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11360 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
11370 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
11380 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
11390 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
113a0 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
113b0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
113c0 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
113d0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
113e0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
113f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11400 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
11410 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
11420 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
11430 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
11440 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
11450 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
11460 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
11470 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
11480 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
11490 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
114a0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
114b0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
114c0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
114d0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
114e0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
114f0 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
11500 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
11510 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
11520 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
11530 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
11540 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
11550 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
11560 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
11570 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
11580 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
11590 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
115a0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
115b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
115c0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
115d0 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
115e0 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
115f0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
11600 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
11610 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
11620 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
11630 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
11640 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
11650 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
11660 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
11670 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
11680 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
11690 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
116a0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
116b0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
116c0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
116d0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
116e0 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
116f0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
11700 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
11710 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
11720 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
11730 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
11740 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
11750 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
11760 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
11770 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
11780 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
11790 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
117a0 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
117b0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
117c0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
117d0 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
117e0 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
117f0 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
11800 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11810 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
11820 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
11830 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
11840 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
11850 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
11860 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
11870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11880 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
11890 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
118a0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
118b0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
118c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
118d0 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
118e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
118f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
11900 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
11910 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
11920 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
11930 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11940 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
11950 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
11960 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
11970 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
11980 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
11990 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
119a0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
119b0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a  late->nLTerm ){.
119c0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
119d0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36  NABLED.      u16
119e0 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
119f0 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20  OrSet->n;.      
11a00 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
11a10 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
11a20 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
11a30 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
11a40 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
11a50 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
11a80 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
11a90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11aa0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11ab0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ac0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11ad0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
11ae0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11af0 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
11b00 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
11b10 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
11b20 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
11b30 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
11b40 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
11b50 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  if.    }.    ret
11b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11b70 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
11b80 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
11b90 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
11ba0 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
11bb0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
11bc0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
11bd0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
11be0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
11bf0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
11c00 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
11c10 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11c20 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
11c30 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
11c40 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
11c50 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
11c60 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
11c70 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
11c80 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
11c90 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
11ca0 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
11cb0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11cc0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11ce0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11cf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11d00 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11d10 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
11d20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
11d30 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
11d40 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
11d50 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
11d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
11d80 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
11d90 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11da0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
11db0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
11dc0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
11dd0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
11de0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
11df0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
11e00 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
11e10 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
11e20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
11e30 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
11e40 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
11e50 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11e60 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
11e70 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11e80 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
11e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11ea0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
11eb0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
11ec0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11ed0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
11ee0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
11ef0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11f00 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
11f10 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11f20 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11f30 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
11f40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
11f50 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
11f60 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
11f70 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
11f80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11f90 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
11fa0 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
11fb0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
11fc0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
11fd0 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
11fe0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11ff0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12000 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
12010 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
12020 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
12030 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
12040 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
12050 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
12060 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
12070 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
12080 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
12090 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
120a0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
120b0 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
120c0 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
120d0 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
120e0 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
120f0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
12100 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
12110 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
12120 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
12130 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
12140 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
12150 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
12160 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
12170 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
12180 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
12190 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
121a0 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
121b0 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
121c0 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
121d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
121e0 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
121f0 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
12200 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12210 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
12220 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12230 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
12250 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
12260 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
12270 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
12280 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
12290 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
122a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
122b0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
122c0 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
122d0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
122e0 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
122f0 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  late);.  if( (p-
12300 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
12310 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
12320 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
12330 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
12340 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
12350 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
12360 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
12370 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
12380 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
12390 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
123a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
123b0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
123c0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
123d0 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
123e0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
123f0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
12400 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
12410 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
12420 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
12430 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
12440 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
12450 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
12460 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
12470 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
12480 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
12490 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
124a0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
124b0 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
124c0 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
124d0 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
124e0 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
124f0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
12500 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
12510 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
12520 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
12530 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
12540 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
12550 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
12560 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12570 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
12580 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
12590 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
125a0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
125b0 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
125c0 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
125d0 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
125e0 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
125f0 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
12600 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
12610 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
12620 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
12630 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
12640 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
12650 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
12660 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
12670 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
12680 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
12690 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
126a0 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
126b0 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
126c0 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
126d0 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
126e0 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
126f0 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
12700 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
12710 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
12720 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
12730 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
12740 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
12750 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
12760 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
12770 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
12780 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
12790 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
127a0 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
127b0 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
127c0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
127d0 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
127e0 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
127f0 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
12800 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
12810 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
12820 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
12830 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
12840 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
12850 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
12860 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
12870 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
12880 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
12890 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
128a0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
128b0 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
128c0 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
128d0 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
128e0 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
128f0 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
12900 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
12910 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
12920 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
12930 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
12940 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
12950 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
12960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12970 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
12980 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
12990 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
129a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
129b0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
129c0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
129d0 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
129e0 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
129f0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
12a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12a10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
12a20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
12a30 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
12a40 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
12a50 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
12a60 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
12a70 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
12a80 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
12a90 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
12aa0 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
12ab0 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
12ac0 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
12ad0 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
12ae0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
12af0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
12b00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
12b10 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
12b20 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
12b30 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
12b40 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
12b50 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
12b60 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
12b70 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
12b80 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12b90 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
12ba0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
12bb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12bc0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
12bd0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
12be0 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
12bf0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
12c00 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
12c10 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
12c20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
12c30 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
12c40 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
12c50 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
12c60 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
12c70 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
12c80 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
12c90 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
12ca0 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
12cb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
12cc0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
12cd0 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
12ce0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
12cf0 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
12d00 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
12d10 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
12d20 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
12d30 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
12d40 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
12d50 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
12d60 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
12d70 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
12d80 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
12d90 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
12da0 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
12db0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
12dc0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
12dd0 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
12de0 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
12df0 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
12e00 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
12e10 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
12e20 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
12e30 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
12e40 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
12e50 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
12e60 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
12e70 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IS) ){.         
12e80 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
12e90 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
12ea0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
12eb0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
12ec0 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
12ed0 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  S );.          i
12ee0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12ef0 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
12f00 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
12f10 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
12f20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
12f30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12f40 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
12f50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
12f60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
12f70 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
12f80 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
12f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12fa0 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
12fb0 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
12fc0 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
12fd0 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
12fe0 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  ce;.}../*.** Adj
12ff0 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
13000 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
13010 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
13020 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
13030 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
13040 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
13050 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
13060 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13070 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
13080 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
13090 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
130a0 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
130b0 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
130c0 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
130d0 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
130e0 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
130f0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
13100 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
13110 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
13120 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
13130 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
13140 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
13150 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13160 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
13170 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
13180 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
13190 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
131a0 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
131b0 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
131c0 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
131d0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
131e0 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
131f0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
13200 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
13210 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
13220 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
13230 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
13240 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
13250 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
13260 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
13270 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
13280 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
13290 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
132a0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
132b0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
132c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
132d0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
132e0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
132f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
13300 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
13310 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
13320 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
13330 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
13340 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
13350 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
13360 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
13370 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
133a0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
133b0 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
133c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
133d0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
133e0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
133f0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
13400 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
13410 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
13420 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
13430 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13440 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13450 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
13460 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13470 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
13480 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
13490 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134b0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
134c0 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
134d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
134e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13500 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
13510 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
13520 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
13550 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
13560 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
13570 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13590 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
135a0 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
135b0 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
135c0 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
135d0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
135e0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
135f0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13600 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
13610 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13620 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13630 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
13640 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
13650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13660 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13670 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
13680 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
13690 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
136a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
136b0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
136c0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
136d0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136f0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
13700 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
13710 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
13720 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
13730 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
13740 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
13750 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
13760 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13780 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
13790 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
137c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
137d0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
137e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
137f0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
13800 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
13810 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13820 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
13830 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
13840 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
13850 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
13860 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
13870 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
13880 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
13890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
138a0 5f 42 4b 50 54 3b 0a 0a 20 20 61 73 73 65 72 74  _BKPT;..  assert
138b0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
138c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
138d0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
138e0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
138f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
13900 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
13910 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
13920 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
13930 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
13940 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
13950 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a  ;.  }else if( /*
13960 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
13970 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a  ||*/ (pSrc->fg.j
13980 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
13990 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d  T)!=0 ){.    opM
139a0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
139b0 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
139c0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
139d0 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d  se{.    opMask =
139e0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
139f0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
13a00 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
13a10 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
13a20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
13a30 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
13a40 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
13a50 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
13a60 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
13a70 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
13a80 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
13a90 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
13aa0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
13ab0 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65  aved_nSkip = pNe
13ac0 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  w->nSkip;.  save
13ad0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
13ae0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
13af0 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
13b00 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
13b10 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
13b20 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
13b30 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
13b40 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68  ut;.  pTerm = wh
13b50 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
13b60 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
13b70 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
13b80 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20   saved_nEq,.    
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
13bb0 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  be);.  pNew->rSe
13bc0 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65  tup = 0;.  rSize
13bd0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
13be0 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f  LogEst[0];.  rLo
13bf0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
13c00 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72  Size);.  for(; r
13c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13c20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
13c30 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
13c40 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
13c50 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
13c60 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
13c70 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
13c80 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
13c90 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
13ca0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
13cb0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
13cc0 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
13cd0 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
13ce0 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
13cf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
13d00 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13d10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
13d20 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
13d30 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13d40 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
13d60 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
13d70 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
13d80 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
13d90 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65  =0).     && inde
13da0 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
13db0 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
13dc0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
13dd0 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
13de0 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
13df0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13e00 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
13e10 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
13e20 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
13e30 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
13e40 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
13e50 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ;..    /* Do not
13e60 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72   allow the upper
13e70 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45   bound of a LIKE
13e80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61   optimization ra
13e90 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  nge constraint. 
13ea0 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74     ** to mix wit
13eb0 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20  h a lower range 
13ec0 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20  bound from some 
13ed0 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a  other source */.
13ee0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
13ef0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
13f00 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e  KEOPT && pTerm->
13f10 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54  eOperator==WO_LT
13f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
13f30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
13f40 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
13f50 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
13f60 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
13f70 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  Eq;.    pNew->nL
13f80 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
13f90 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
13fa0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
13fb0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
13fc0 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
13fd0 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
13fe0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
13ff0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
14000 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
14010 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
14020 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
14030 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
14040 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
14050 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
14060 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
14070 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14080 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
14090 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
140a0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
140b0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
140c0 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
140d0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
140e0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
140f0 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
14100 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
14110 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
14120 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
14130 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
14140 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
14150 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
14160 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
14170 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14180 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
14190 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
141a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
141b0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
141c0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
141d0 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
141e0 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
141f0 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
14200 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
14210 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
14220 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
14230 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
14240 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
14250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
14260 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
14270 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
14280 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
14290 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
142a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
142b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
142c0 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f  ert( nIn>0 );  /
142d0 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73  * RHS always has
142e0 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73   2 or more terms
142f0 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a  ...  The parser.
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67          ** chang
14320 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e  es "x IN (?)" in
14330 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20  to "x=?". */..  
14340 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
14350 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  & (WO_EQ|WO_IS) 
14360 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
14370 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
14380 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b  lumn[saved_nEq];
14390 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
143a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
143b0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61  LUMN_EQ;.      a
143c0 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71  ssert( saved_nEq
143d0 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ==pNew->u.btree.
143e0 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nEq );.      if(
143f0 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
14400 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c  .       || (iCol
14410 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20  >0 && nInMul==0 
14420 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
14430 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
14440 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14450 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
14460 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74   pProbe->uniqNot
14470 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
14480 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14490 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
144a0 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
144b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
144c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
144d0 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
14500 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
14510 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
14520 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14530 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
14540 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
14550 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
14560 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
14570 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
14580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14590 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
145a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
145b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
145c0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
145d0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
145e0 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
145f0 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
14600 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14610 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
14620 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
14630 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
14640 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
14650 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
14660 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
14670 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
14680 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
14690 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
146a0 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
146b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
146c0 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
146d0 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
146e0 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
146f0 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
14700 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
14710 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
14720 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
14730 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
14740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
14750 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
14760 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
14770 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
14780 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
14790 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
147a0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
147b0 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
147c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
147d0 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
147e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
147f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
14800 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
14810 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
14820 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14830 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
14840 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
14850 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
14860 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
14870 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
14880 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
14890 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
148a0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
148b0 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
148c0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
148d0 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14900 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
14910 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
14920 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
14930 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
14940 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
14950 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14960 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
14970 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
14980 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
14990 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
149a0 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
149b0 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
149c0 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
149d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
149e0 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
149f0 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
14a00 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
14a10 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
14a20 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
14a30 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
14a40 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
14a50 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
14a60 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
14a70 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
14a80 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
14a90 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
14aa0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
14ab0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
14ac0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
14ad0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14ae0 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
14af0 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
14b00 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
14b10 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
14b20 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
14b30 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
14b40 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
14b50 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
14b60 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
14b70 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
14b80 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
14b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ba0 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
14bb0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
14bd0 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
14be0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
14bf0 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
14c00 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
14c10 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
14c20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14c30 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
14c40 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
14c50 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
14c60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14c70 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
14c80 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
14c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14ca0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
14cb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14cc0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
14cd0 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
14ce0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
14cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
14d00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14d10 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14d20 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
14d30 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
14d40 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
14d50 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
14d60 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
14d70 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
14d80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
14d90 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
14da0 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
14db0 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
14dc0 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
14dd0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
14de0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
14df0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
14e00 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
14e10 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
14e20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14e30 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
14e40 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
14e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14e60 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14e70 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
14e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14e90 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14eb0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14ec0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
14ed0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
14ee0 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
14ef0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
14f00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
14f10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14f30 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
14f40 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14f50 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
14f60 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
14f70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14f80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14f90 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
14fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
14fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
14fd0 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
14fe0 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
14ff0 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
15000 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
15010 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15020 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
15030 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
15040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15050 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
15060 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
15070 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
15080 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
15090 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
150a0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
150b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150c0 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
150d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
150e0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
150f0 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
15100 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
15110 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
15120 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
15130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
15140 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
15160 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
15170 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
15180 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
15190 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
151a0 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
151b0 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
151c0 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
151d0 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
151e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
151f0 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
15200 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
15210 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
15220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
15240 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
15250 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
15260 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
15270 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
15280 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
15290 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
152a0 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
152b0 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
152c0 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
152d0 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
152e0 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
152f0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
15300 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
15310 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
15320 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
15330 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
15340 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
15350 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
15360 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
15370 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
15380 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
15390 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
153a0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
153b0 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
153c0 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
153d0 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
153e0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
153f0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
15400 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
15410 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
15420 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
15430 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
15440 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
15450 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
15460 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
15470 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
15480 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
15490 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
154a0 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
154b0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
154c0 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
154d0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
154e0 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
154f0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
15500 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
15510 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
15520 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
15530 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
15540 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
15550 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
15560 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15570 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
15580 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
15590 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
155a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
155c0 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
155d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
155e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
155f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
15600 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
15610 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
15620 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
15630 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
15640 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
15650 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
15660 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
15670 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
15680 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
15690 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
156a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
156b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
156c0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
156d0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
156e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
156f0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
15700 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
15710 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
15720 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
15730 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
15740 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
15750 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
15760 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
15770 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15780 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
15790 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
157a0 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  rm;..  /* Consid
157b0 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
157c0 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
157d0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
157e0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
157f0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
15800 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
15810 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
15820 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
15830 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
15840 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
15850 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
15860 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
15870 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  18. .  **.  ** T
15880 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20  he magic number 
15890 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f  18 is selected o
158a0 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74  n the basis that
158b0 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77   scanning 17 row
158c0 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74  s.  ** is almost
158d0 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20   always quicker 
158e0 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65  than an index se
158f0 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20  ek (even though 
15900 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  if the index.  *
15910 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  * contains fewer
15920 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20   than 2^17 rows 
15930 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77  we assume otherw
15940 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72  ise in other par
15950 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ts of.  ** the c
15960 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20  ode). And, even 
15970 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  if it is not, it
15980 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74   should not be t
15990 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20  oo much slower. 
159a0 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68  .  ** On the oth
159b0 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74  er hand, the ext
159c0 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65  ra seeks could e
159d0 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e  nd up being sign
159e0 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d  ificantly.  ** m
159f0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20  ore expensive.  
15a00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d  */.  assert( 42=
15a10 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
15a20 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65  8) );.  if( save
15a30 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
15a40 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
15a50 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
15a60 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
15a70 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30  e->noSkipScan==0
15a80 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
15a90 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
15aa0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
15ab0 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
15ac0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
15ad0 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
15ae0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
15af0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
15b00 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
15b10 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
15b20 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
15b30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
15b40 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  +;.    pNew->nSk
15b50 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ip++;.    pNew->
15b60 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
15b70 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  erm++] = 0;.    
15b80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15b90 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b   WHERE_SKIPSCAN;
15ba0 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72  .    nIter = pPr
15bb0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15bc0 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50  [saved_nEq] - pP
15bd0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15be0 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a  t[saved_nEq+1];.
15bf0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
15c00 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
15c10 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
15c20 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
15c30 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
15c40 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
15c50 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
15c60 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
15c70 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
15c80 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
15c90 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
15ca0 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
15cb0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
15cc0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
15cd0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
15ce0 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
15cf0 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
15d00 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
15d10 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
15d20 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
15d30 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
15d40 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
15d50 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  kip;.    pNew->w
15d60 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
15d70 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72  sFlags;.  }..  r
15d80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15d90 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
15da0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
15db0 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
15dc0 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
15dd0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
15de0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
15df0 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
15e00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
15e10 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
15e20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
15e30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
15e40 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
15e50 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
15e60 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
15e70 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
15e80 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
15e90 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
15ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
15eb0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
15ec0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
15ed0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
15ee0 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
15ef0 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
15f00 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
15f10 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69  t *pOB;.  ExprLi
15f20 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20  st *aColExpr;.  
15f30 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69  int ii, jj;..  i
15f40 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  f( pIndex->bUnor
15f50 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30  dered ) return 0
15f60 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70  ;.  if( (pOB = p
15f70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
15f80 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20  >pOrderBy)==0 ) 
15f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
15fa0 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45  ii=0; ii<pOB->nE
15fb0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
15fc0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71  Expr *pExpr = sq
15fd0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
15fe0 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e  late(pOB->a[ii].
15ff0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
16000 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
16010 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
16020 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
16030 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
16040 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
16050 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
16060 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
16070 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
16080 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16090 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
160a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
160b0 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
160c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
160d0 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72  se if( (aColExpr
160e0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45   = pIndex->aColE
160f0 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)!=0 ){.     
16100 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
16110 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
16120 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16130 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
16140 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20  mn[jj]!=XN_EXPR 
16150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16170 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
16180 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d  ,aColExpr->a[jj]
16190 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d  .pExpr,iCursor)=
161a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
161b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
161c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
161d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
161e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
161f0 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
16200 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
16210 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
16220 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
16230 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
16240 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
16250 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
16260 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
16270 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
16280 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
16290 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
162a0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
162b0 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
162c0 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
162d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
162e0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
162f0 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
16300 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
16310 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
16320 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
16330 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
16340 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
16350 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
16360 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
16370 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
16380 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
16390 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
163a0 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
163b0 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
163c0 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
163d0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
163e0 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
163f0 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
16400 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
16410 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
16420 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
16430 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
16440 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
16450 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
16460 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
16470 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
16480 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  Term;.  while( p
16490 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
164a0 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68  D ){.    if( !wh
164b0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
164c0 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70  Index(iTab,pWC,p
164d0 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20  Where->pLeft) ) 
164e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57  return 0;.    pW
164f0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
16500 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  Right;.  }.  for
16510 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
16520 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
16530 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
16540 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
16550 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
16560 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16570 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
16580 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
16590 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21  Tab) .     && (!
165a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
165b0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
165c0 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
165d0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
165e0 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
165f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16600 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
16610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
16620 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
16630 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
16640 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
16650 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
16660 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
16670 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
16680 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
16690 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
166a0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
166b0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
166c0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
166d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
166e0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
166f0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
16700 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
16710 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
16720 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
16730 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
16740 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
16750 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
16760 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
16770 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
16780 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
16790 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
167a0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
167b0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
167c0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
167d0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
16800 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
16810 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16820 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
16830 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
16840 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
16850 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
16860 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
16870 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
16880 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
16890 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
168a0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
168b0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
168c0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
168d0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
168e0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
168f0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
16900 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16910 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
16920 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
16930 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
16940 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16950 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
16960 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
16970 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
16980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
16990 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
169a0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
169b0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
169c0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
169d0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
169e0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
169f0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
16a00 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
16a10 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
16a20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
16a30 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
16a40 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
16a50 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
16a60 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
16a70 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
16a80 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
16a90 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
16aa0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
16ab0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
16ac0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
16ad0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
16ae0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
16af0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
16b00 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
16b10 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
16b20 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
16b30 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
16b40 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
16b50 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
16b60 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
16b70 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
16b80 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
16b90 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
16ba0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
16bb0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
16bc0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
16bd0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
16be0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
16bf0 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
16c00 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
16c10 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
16c20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
16c30 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
16c40 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
16c50 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
16c60 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
16c70 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
16c80 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
16c90 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
16ca0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
16cb0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
16cc0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
16cd0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
16ce0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
16cf0 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
16d00 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16d10 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
16d20 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
16d30 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
16d40 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
16d50 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
16d60 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
16d70 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
16d80 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
16d90 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
16da0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
16db0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
16dc0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16de0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
16df0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
16e00 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
16e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e20 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
16e30 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
16e40 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
16e50 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
16e60 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
16e70 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
16e80 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
16e90 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
16ea0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
16eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
16ec0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
16ed0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16ee0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
16ef0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
16f00 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
16f10 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16f20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
16f30 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
16f40 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
16f50 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
16f60 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
16f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
16f80 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
16f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
16fb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16fc0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
16fd0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
16fe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16ff0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
17000 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
17010 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
17020 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
17030 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17050 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17060 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
17070 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
17080 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17090 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
170a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
170b0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
170c0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
170d0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
170e0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
170f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
17100 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
17110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
17120 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
17130 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
17140 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
17150 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
17160 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
17170 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
17180 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
17190 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
171a0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
171b0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
171c0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
171d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
171e0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
171f0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
17200 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
17210 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
17220 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
17230 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
17240 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
17250 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
17260 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
17270 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
17280 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
17290 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
172a0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
172b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
172c0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
172d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
172e0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
172f0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
17300 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
17310 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
17320 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
17330 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
17340 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
17350 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
17360 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
17370 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
17380 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
17390 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
173a0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
173b0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
173c0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
173d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
173e0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
173f0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
17400 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
17410 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
17420 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
17430 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
17440 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
17450 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
17460 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
17470 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
17480 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
17490 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
174a0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
174b0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
174c0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
174d0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
174e0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
174f0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
17500 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
17510 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
17520 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
17530 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
17540 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
17550 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
17560 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
17570 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
17580 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
17590 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
175a0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
175b0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
175c0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
175d0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
175e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
175f0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
17600 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
17610 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
17620 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
17630 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
17640 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
17650 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
17660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17670 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
17680 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
17690 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
176a0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
176b0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
176c0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
176d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
176e0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
176f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
17700 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29  RE_NO_AUTOINDEX)
17710 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
17720 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
17730 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
17740 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
17750 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
17760 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
17770 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
17780 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
17790 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
177a0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
177b0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
177c0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
177d0 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
177e0 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
177f0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
17800 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
17810 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
17820 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
17830 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
17840 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
17850 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
17860 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
17870 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
17880 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
17890 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
178a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
178b0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
178c0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
178d0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
178e0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
178f0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
17900 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
17910 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
17920 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
17930 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
17940 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
17950 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
17960 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
17970 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
17980 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
17990 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
179a0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
179b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
179c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
179d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
179e0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
179f0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
17a00 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
17a10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
17a20 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
17a30 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
17a40 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
17a50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
17a60 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
17a70 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
17a80 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
17a90 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
17aa0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
17ab0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
17ac0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17ad0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
17ae0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
17af0 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
17b00 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
17b10 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
17b20 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
17b30 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
17b40 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
17b50 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
17b60 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
17b70 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
17b80 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
17b90 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
17ba0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
17bb0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
17bc0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
17bd0 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
17be0 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
17bf0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
17c00 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
17c10 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
17c20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
17c30 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
17c40 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
17c50 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
17c60 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
17c70 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
17c80 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
17c90 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
17ca0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
17cb0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
17cc0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
17cd0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
17ce0 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
17cf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17d00 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
17d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
17d20 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
17d30 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
17d40 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
17d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
17d60 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
17d70 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
17d80 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17d90 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
17da0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
17db0 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
17dc0 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
17dd0 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
17de0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
17df0 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65  knowing how sele
17e00 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
17e10 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
17e20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20  be.  It would.  
17e30 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
17e40 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20  unreasonable to 
17e50 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20  make this value 
17e60 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a  much larger. */.
17e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17e80 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74  ut = 43;  assert
17e90 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 43==sqlite3Log
17ea0 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  Est(20) );.     
17eb0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17ec0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17ed0 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
17ee0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
17ef0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
17f00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
17f10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
17f20 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c  rereq = mExtra |
17f30 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
17f40 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
17f50 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
17f60 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
17f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17f80 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
17f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
17fa0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
17fb0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
17fc0 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
17fd0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
17fe0 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
17ff0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
18000 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
18010 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
18020 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
18030 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
18040 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
18050 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
18060 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
18070 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
18080 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
18090 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
180a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
180b0 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
180c0 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
180d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
180e0 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
180f0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
18100 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
18110 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
18120 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
18130 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
18140 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18150 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18160 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
18170 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
18180 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
18190 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
181a0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
181b0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
181c0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
181d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
181e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
181f0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
18200 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
18210 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
18220 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
18230 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
18240 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
18250 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
18260 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
18270 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
18280 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
18290 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
182a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
182b0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
182c0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
182d0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
182e0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
182f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
18300 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
18310 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
18320 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
18330 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
18340 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
18350 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
18360 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
18370 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
18380 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
18390 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
183a0 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
183b0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
183c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
183d0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70   + 16;.      App
183e0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
183f0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
18400 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
18410 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
18420 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
18430 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
18440 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18450 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18460 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
18470 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
18480 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  e;.      if( rc 
18490 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
184a0 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
184b0 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k m;.      if( p
184c0 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e  Probe->isCoverin
184d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  g ){.        pNe
184e0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
184f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
18500 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
18510 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20       m = 0;.    
18520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18530 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
18540 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
18550 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20  ndex(pProbe);.  
18560 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
18570 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
18580 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
18590 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
185a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
185b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
185c0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
185d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
185e0 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48  ( b.       || !H
185f0 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
18600 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
18610 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
18620 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
18630 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
18640 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
18650 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
18660 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
18670 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
18680 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
18690 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
186a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
186b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
186c0 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
186d0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
186e0 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
186f0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
18700 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
18710 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
18720 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
18730 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
18740 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
18750 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
18760 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
18770 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
18780 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
18790 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
187a0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
187b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
187c0 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
187d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
187e0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
187f0 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69   rows. If this i
18800 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
18810 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20   index scan,.   
18820 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64       ** also add
18830 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
18840 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73  iting table rows
18850 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20   (N*3.0).  */.  
18860 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
18870 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28   = rSize + 1 + (
18880 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
18890 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62  Row)/pTab->szTab
188a0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Row;.        if(
188b0 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m!=0 ){.       
188c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
188d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
188e0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69  (pNew->rRun, rSi
188f0 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20  ze+16);.        
18900 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
18910 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
18920 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
18930 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
18940 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
18950 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
18960 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
18970 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
18980 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
18990 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
189a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
189b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
189c0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
189d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
189e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
189f0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
18a00 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
18a10 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
18a20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18a30 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
18a40 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
18a50 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
18a60 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
18a70 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
18a80 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
18a90 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
18aa0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
18ab0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
18ac0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
18ad0 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
18ae0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
18af0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
18b00 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
18b10 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  IBIndex ) break;
18b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18b30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18b40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18b50 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  TABLE../*.** Arg
18b60 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69  ument pIdxInfo i
18b70 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
18b80 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  ted with all con
18b90 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61  straints that ma
18ba0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20  y.** be used by 
18bb0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
18bc0 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
18bd0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
18be0 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75  iTab. This.** fu
18bf0 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
18c00 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63  ubset of those c
18c10 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c  onstraints usabl
18c20 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  e, invokes the.*
18c30 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  * xBestIndex met
18c40 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65  hod and adds the
18c50 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74   returned plan t
18c60 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
18c70 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  * A constraint i
18c80 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20  s marked usable 
18c90 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72  if:.**.**   * Ar
18ca0 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69  gument mUsable i
18cb0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74  ndicates that it
18cc0 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  s prerequisites 
18cd0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61  are available, a
18ce0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20  nd.**.**   * It 
18cf0 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68  is not one of th
18d00 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63  e operators spec
18d10 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78  ified in the mEx
18d20 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65  clude mask passe
18d30 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20  d.**     as the 
18d40 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
18d50 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69  (which in practi
18d60 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f  ce is either WO_
18d70 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  IN or 0)..**.** 
18d80 41 72 67 75 6d 65 6e 74 20 6d 45 78 74 72 61 20  Argument mExtra 
18d90 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62  is a mask of tab
18da0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
18db0 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
18dc0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
18dd0 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
18de0 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65  . These are adde
18df0 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70  d to the plans p
18e00 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20  rerequisites.** 
18e10 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64  before it is add
18e20 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  ed to pBuilder..
18e30 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72  **.** Output par
18e40 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20  ameter *pbIn is 
18e50 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
18e60 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f  he plan added to
18e70 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65   pBuilder.** use
18e80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f  s one or more WO
18e90 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61  _IN terms, or fa
18ea0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
18eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18ec0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
18ed0 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  One(.  WhereLoop
18ee0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
18ef0 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  r,.  Bitmask mEx
18f00 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
18f10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
18f20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  tables that must
18f30 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42   be used. */.  B
18f40 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20  itmask mUsable, 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f60 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65  * Mask of usable
18f70 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 75 31   prereqs */.  u1
18f80 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20  6 mExclude,     
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fa0 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 66   Exclude terms f
18fb0 6f 72 20 74 68 69 73 20 6f 70 65 72 61 74 6f 72  or this operator
18fc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
18fd0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
18fe0 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
18ff0 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
19000 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  estIndex */.  in
19010 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19030 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
19040 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
19050 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
19060 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
19070 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
19080 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
19090 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
190a0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
190b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
190c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
190d0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
190e0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
190f0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
19100 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
19110 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19120 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
19130 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
19140 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
19150 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
19160 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
19170 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
19180 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19190 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
191a0 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
191b0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
191c0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
191d0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
191e0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
191f0 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
19200 20 26 20 6d 45 78 74 72 61 29 3d 3d 6d 45 78 74   & mExtra)==mExt
19210 72 61 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20  ra );.  *pbIn = 
19220 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  0;.  pNew->prere
19230 71 20 3d 20 6d 45 78 74 72 61 3b 0a 0a 20 20 2f  q = mExtra;..  /
19240 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65  * Set the usable
19250 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62   flag on the sub
19260 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  set of constrain
19270 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ts identified by
19280 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73   .  ** arguments
19290 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78   mUsable and mEx
192a0 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78  clude. */.  pIdx
192b0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
192c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
192d0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
192e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
192f0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
19300 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
19310 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
19320 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
19330 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49  erm = &pWC->a[pI
19340 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
19350 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  set];.    pIdxCo
19360 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
19370 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19380 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
19390 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70  sable)==pTerm->p
193a0 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20  rereqRight .    
193b0 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
193c0 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65  rator & mExclude
193d0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
193e0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
193f0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
19400 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
19410 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ze the output fi
19420 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69  elds of the sqli
19430 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
19440 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65  tructure */.  me
19450 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
19460 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
19470 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  )*nConstraint);.
19480 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
19490 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
194a0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
194b0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
194c0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  );.  pIdxInfo->i
194d0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
194e0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
194f0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  0;.  pIdxInfo->n
19500 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
19510 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
19520 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
19530 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
19540 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
19550 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
19560 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
19570 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19580 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
19590 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
195a0 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  gs = 0;.  pIdxIn
195b0 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73  fo->colUsed = (s
195c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72  qlite3_int64)pSr
195d0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f  c->colUsed;..  /
195e0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72  * Invoke the vir
195f0 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74  tual table xBest
19600 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a  Index() method *
19610 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73  /.  rc = vtabBes
19620 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
19630 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49  Src->pTab, pIdxI
19640 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nfo);.  if( rc )
19650 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d   return rc;..  m
19660 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73  xTerm = -1;.  as
19670 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
19680 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
19690 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
196a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
196b0 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
196c0 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  ] = 0;.  pNew->u
196d0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
196e0 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   0;.  pIdxCons =
196f0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
19700 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
19710 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
19720 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
19730 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
19740 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
19750 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  Cons++){.    int
19760 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20   iTerm;.    if( 
19770 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
19780 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
19790 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )>=0 ){.      Wh
197a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
197b0 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49        int j = pI
197c0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
197d0 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  set;.      if( i
197e0 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
197f0 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a  t.       || j<0.
19800 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
19810 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c  ->nTerm.       |
19820 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
19830 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 29  Term]!=0.      )
19840 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
19850 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
19860 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19870 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
19880 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c  xBestIndex() mal
19890 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
198a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
198b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
198c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
198d0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
198e0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
198f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19900 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
19910 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
19920 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
19930 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
19940 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
19950 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
19960 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
19970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
19980 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
19990 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
199a0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
199b0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
199c0 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
199d0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
199e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
199f0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
19a00 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19a10 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
19a20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
19a30 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
19a40 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
19a50 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
19a60 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
19a70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19a80 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
19a90 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
19aa0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
19ab0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
19ac0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
19ad0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
19ae0 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
19af0 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
19b00 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
19b10 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
19b20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
19b30 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
19b40 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
19b50 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
19b60 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
19b70 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
19b80 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
19b90 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
19ba0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
19bb0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
19bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
19bd0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
19be0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
19bf0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
19c00 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
19c10 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
19c20 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
19c30 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  In = 1;.      }.
19c40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4e 65      }.  }..  pNe
19c50 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
19c60 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rm+1;.  assert( 
19c70 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
19c80 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
19c90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
19ca0 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
19cb0 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e  idxNum;.  pNew->
19cc0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19cd0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
19ce0 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
19cf0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
19d00 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
19d10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
19d20 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
19d30 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77  ->idxStr;.  pNew
19d40 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
19d50 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
19d60 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
19d70 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78  med ?.      pIdx
19d80 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
19d90 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65   0);.  pNew->rSe
19da0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
19db0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
19dc0 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
19dd0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19de0 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77  tedCost);.  pNew
19df0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
19e00 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
19e10 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
19e20 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57  ..  /* Set the W
19e30 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67  HERE_ONEROW flag
19e40 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
19e50 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69  ex() method indi
19e60 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  cated.  ** that 
19e70 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
19e80 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  sit at most one 
19e90 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74  row. Clear it ot
19ea0 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66  herwise. */.  if
19eb0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46  ( pIdxInfo->idxF
19ec0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e  lags & SQLITE_IN
19ed0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20  DEX_SCAN_UNIQUE 
19ee0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ){.    pNew->wsF
19ef0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
19f00 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EROW;.  }else{. 
19f10 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19f20 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f   &= ~WHERE_ONERO
19f30 57 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  W;.  }.  whereLo
19f40 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
19f50 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
19f60 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
19f70 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
19f80 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
19f90 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
19fa0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
19fb0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
19fc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
19fe0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
19ff0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1a000 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
1a010 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
1a020 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
1a030 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
1a040 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
1a050 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
1a060 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
1a070 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1a080 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
1a090 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
1a0a0 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45  e query, both mE
1a0b0 78 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75  xtra and.** mUnu
1a0c0 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f  sable are set to
1a0d0 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d   0. Otherwise, m
1a0e0 45 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20  Extra is a mask 
1a0f0 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1a100 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1a110 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1a120 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a130 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1a140 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1a150 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1a160 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1a170 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1a180 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1a190 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1a1a0 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1a1b0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1a1c0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1a1d0 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1a1e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1a1f0 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1a200 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1a210 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1a220 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1a230 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1a240 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1a250 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1a260 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1a270 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1a280 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1a290 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1a2a0 6e 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70  n mExtra corresp
1a2b0 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29  onds to (t1, t2)
1a2c0 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74   and mUnusable t
1a2d0 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a  o (t5, t6)..**.*
1a2e0 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  * All the tables
1a2f0 20 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20   in mExtra must 
1a300 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1a310 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
1a320 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
1a330 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
1a340 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
1a350 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
1a360 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
1a370 45 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65  Extra may be spe
1a380 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1a390 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1a3a0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1a3b0 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1a3c0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1a3d0 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1a3e0 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1a3f0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1a400 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1a410 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1a420 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1a430 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1a440 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1a450 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1a460 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1a470 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1a480 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1a490 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1a4a0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1a4b0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1a4c0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1a4d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1a4e0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1a4f0 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20  mask mExtra,    
1a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1a510 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1a520 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1a530 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1a540 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1a550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1a560 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1a570 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1a580 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1a590 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a5a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1a5b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1a5c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1a5d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1a5e0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1a5f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1a600 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a620 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1a630 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1a640 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1a650 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1a660 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1a670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a680 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1a690 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1a6a0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1a6b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1a6c0 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1a6d0 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1a6e0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1a6f0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1a700 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1a710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1a720 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1a730 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1a760 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1a770 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1a780 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1a790 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7b0 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1a7c0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1a7d0 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
1a7e0 28 6d 45 78 74 72 61 20 26 20 6d 55 6e 75 73 61  (mExtra & mUnusa
1a7f0 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1a800 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1a810 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1a820 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1a830 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1a840 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1a850 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1a860 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1a870 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1a880 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1a890 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1a8a0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1a8b0 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1a8c0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1a8d0 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1a8e0 20 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e   pSrc,pBuilder->
1a8f0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
1a900 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1a910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1a920 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
1a930 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
1a940 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
1a950 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
1a960 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
1a970 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a980 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e  eedFree = 0;.  n
1a990 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e  Constraint = p->
1a9a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
1a9b0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
1a9c0 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
1a9d0 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
1a9e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1a9f0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1aa00 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72  b, p);.    retur
1aa10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1aa20 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  KPT;.  }..  /* F
1aa30 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49  irst call xBestI
1aa40 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1aa50 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1aa60 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 77 68  le. */.  rc = wh
1aa70 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1aa80 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1aa90 45 78 74 72 61 2c 20 28 42 69 74 6d 61 73 6b 29  Extra, (Bitmask)
1aaa0 28 2d 31 29 2c 20 30 2c 20 70 2c 20 26 62 49 6e  (-1), 0, p, &bIn
1aab0 29 3b 0a 20 20 6d 42 65 73 74 20 3d 20 70 4e 65  );.  mBest = pNe
1aac0 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 45 78  w->prereq & ~mEx
1aad0 74 72 61 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  tra;..  /* If th
1aae0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1aaf0 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1ab00 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1ab10 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1ab20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1ab30 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1ab40 72 63 65 20 74 61 62 6c 65 73 2c 20 74 68 65 72  rce tables, ther
1ab50 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1ab60 20 6d 61 6b 69 6e 67 0a 20 20 2a 2a 20 61 6e 79   making.  ** any
1ab70 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 2d   further calls -
1ab80 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
1ab90 65 78 28 29 20 6d 65 74 68 6f 64 20 69 73 20 73  ex() method is s
1aba0 61 6e 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  ane they will al
1abb0 6c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  l.  ** return th
1abc0 65 20 73 61 6d 65 20 70 6c 61 6e 20 61 6e 79 77  e same plan anyw
1abd0 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d  ay..  */.  if( m
1abe0 42 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Best ){.    int 
1abf0 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1ac00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ac10 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1ac20 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1ac30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1ac40 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1ac50 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1ac60 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1ac70 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1ac80 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1ac90 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1aca0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1acb0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1acc0 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1acd0 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1ace0 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1acf0 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1ad00 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1ad10 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1ad20 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1ad30 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1ad40 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  d. */.    if( rc
1ad50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1ad60 49 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  In ){.      rc =
1ad70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1ad80 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1ad90 2c 20 6d 45 78 74 72 61 2c 20 28 42 69 74 6d 61  , mExtra, (Bitma
1ada0 73 6b 29 2d 31 2c 20 57 4f 5f 49 4e 2c 20 70 2c  sk)-1, WO_IN, p,
1adb0 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 6d 42 65  &bIn);.      mBe
1adc0 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70  stNoIn = pNew->p
1add0 72 65 72 65 71 20 26 20 7e 6d 45 78 74 72 61 3b  rereq & ~mExtra;
1ade0 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1adf0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1ae00 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1ae10 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e  .        if( bIn
1ae20 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f  ==0 ) seenZeroNo
1ae30 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1ae40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1ae50 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1ae60 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1ae70 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1ae80 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
1ae90 78 74 72 61 29 20 0a 20 20 20 20 2a 2a 20 69 6e  xtra) .    ** in
1aea0 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d   the set of term
1aeb0 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
1aec0 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1aed0 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ual table.  */. 
1aee0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1aef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1af00 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69   int i;.      Bi
1af10 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 28 42  tmask mNext = (B
1af20 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 20  itmask)(-1);.   
1af30 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74     assert( mNext
1af40 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >0 );.      for(
1af50 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1af60 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1af70 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20    Bitmask mThis 
1af80 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
1af90 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74  pWC->a[p->aConst
1afa0 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
1afb0 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
1afc0 74 20 26 20 7e 6d 45 78 74 72 61 0a 20 20 20 20  t & ~mExtra.    
1afd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1afe0 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26  f( mThis>mPrev &
1aff0 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20  & mThis<mNext ) 
1b000 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20  mNext = mThis;. 
1b010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72       }.      mPr
1b020 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20  ev = mNext;.    
1b030 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 28 42 69    if( mNext==(Bi
1b040 74 6d 61 73 6b 29 28 2d 31 29 20 29 20 62 72 65  tmask)(-1) ) bre
1b050 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  ak;.      if( mN
1b060 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e  ext==mBest || mN
1b070 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29  ext==mBestNoIn )
1b080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b090 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b0a0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75  ddVirtualOne(pBu
1b0b0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d  ilder, mExtra, m
1b0c0 4e 65 78 74 2c 20 30 2c 20 70 2c 20 26 62 49 6e  Next, 0, p, &bIn
1b0d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
1b0e0 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 45 78 74 72  w->prereq==mExtr
1b0f0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  a ){.        see
1b100 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  nZero = 1;.     
1b110 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1b120 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1b130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1b150 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1b160 65 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76  ex() in the abov
1b170 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66  e loop did not f
1b180 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1b190 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1b1a0 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1b1b0 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e   at all (i.e. on
1b1c0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1b1d0 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  be.    ** usable
1b1e0 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68  ), make a call h
1b1f0 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75  ere with all sou
1b200 72 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62  rce tables disab
1b210 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  led */.    if( r
1b220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b230 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20  seenZero==0 ){. 
1b240 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b250 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1b260 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
1b270 61 2c 20 6d 45 78 74 72 61 2c 20 30 2c 20 70 2c  a, mExtra, 0, p,
1b280 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1b290 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1b2a0 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1b2b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1b2c0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1b2d0 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1b2e0 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1b2f0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1b300 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1b310 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1b320 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1b330 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1b340 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1b350 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1b360 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1b370 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1b380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b390 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1b3a0 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1b3b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b3c0 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1b3d0 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 45  lder, mExtra, mE
1b3e0 78 74 72 61 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  xtra, WO_IN, p, 
1b3f0 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  &bIn);.    }.  }
1b400 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54  ..  if( p->needT
1b410 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
1b420 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64  lite3_free(p->id
1b430 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
1b440 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b450 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  b, p);.  return 
1b460 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1b470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1b480 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
1b490 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
1b4a0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
1b4b0 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
1b4c0 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
1b4d0 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
1b4e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
1b4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b500 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20  hereLoopAddOr(. 
1b510 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1b520 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20  r *pBuilder, .  
1b530 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20  Bitmask mExtra, 
1b540 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1b550 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49  able.){.  WhereI
1b560 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1b570 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1b580 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1b590 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
1b5a0 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
1b5b0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
1b5c0 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
1b5d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1b5e0 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
1b5f0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
1b600 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
1b610 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
1b620 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
1b630 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
1b640 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b650 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
1b660 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43  lder->pWC;.  pWC
1b670 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
1b680 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
1b690 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1b6a0 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
1b6b0 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
1b6c0 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
1b6d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1b6e0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
1b6f0 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
1b700 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
1b710 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
1b720 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
1b730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
1b740 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
1b750 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1b760 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
1b770 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
1b780 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
1b790 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
1b7a0 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
1b7b0 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
1b7c0 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
1b7d0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1b7e0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1b7f0 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
1b800 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
1b810 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
1b820 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
1b830 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
1b840 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
1b850 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
1b860 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
1b870 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
1b880 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
1b890 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
1b8a0 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
1b8b0 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
1b8c0 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45  ur;..      WHERE
1b8d0 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42  TRACE(0x200, ("B
1b8e0 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  egin processing 
1b8f0 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1b900 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20   pTerm));.      
1b910 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
1b920 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
1b930 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
1b940 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1b950 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
1b960 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
1b970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b980 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
1b990 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
1b9a0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
1b9b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
1b9c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1b9d0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
1b9e0 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
1b9f0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
1ba00 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1ba10 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
1ba20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
1ba30 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
1ba40 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
1ba50 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
1ba60 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
1ba70 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
1ba80 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1ba90 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
1baa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1bab0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
1bad0 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  r.n = 0;.#ifdef 
1bae0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
1baf0 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ED.        WHERE
1bb00 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f  TRACE(0x200, ("O
1bb10 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20  R-term %d of %p 
1bb20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a  has %d subterms:
1bb30 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1bb40 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
1bb50 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29  OrTerm-pOrWC->a)
1bb60 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69  , pTerm, sSubBui
1bb70 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b  ld.pWC->nTerm));
1bb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1bb90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
1bba0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
1bbb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1bbc0 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54  SubBuild.pWC->nT
1bbd0 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
1bbe0 20 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d         whereTerm
1bbf0 50 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64  Print(&sSubBuild
1bc00 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  .pWC->a[i], i);.
1bc10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bc20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1bc30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bc40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1bc50 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1bc60 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1bc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1bc80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1bc90 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
1bca0 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  d, mExtra, mUnus
1bcb0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  able);.        }
1bcc0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
1bcd0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
1bce0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1bcf0 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
1bd00 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
1bd10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1bd20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bd30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1bd40 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1bd50 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
1bd60 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  tra, mUnusable);
1bd70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bd80 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1bd90 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
1bda0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
1bdb0 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
1bdc0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
1bdd0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1bde0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bdf0 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
1be00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
1be10 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
1be20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
1be30 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1be40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be50 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20       WhereOrSet 
1be60 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  sPrev;.         
1be70 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50   whereOrMove(&sP
1be80 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20  rev, &sSum);.   
1be90 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1bea0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
1beb0 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b  (i=0; i<sPrev.n;
1bec0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1bed0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43     for(j=0; j<sC
1bee0 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ur.n; j++){.    
1bef0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1bf00 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73  rInsert(&sSum, s
1bf10 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71  Prev.a[i].prereq
1bf20 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65   | sCur.a[j].pre
1bf30 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1bf60 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
1bf70 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
1bf80 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1bfb0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
1bfc0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
1bfd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1bfe0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1bff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c000 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
1c010 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
1c020 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
1c030 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
1c040 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1c050 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
1c060 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1c070 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
1c080 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
1c090 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
1c0a0 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
1c0b0 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
1c0c0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
1c0d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
1c0e0 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
1c0f0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75     /* TUNING: Cu
1c100 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69  rrently sSum.a[i
1c110 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f  ].rRun is set to
1c120 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
1c130 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  costs.        **
1c140 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e   of all sub-scan
1c150 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1c160 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76  e OR-scan. Howev
1c170 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64  er, due to round
1c180 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ing.        ** e
1c190 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65  rrors, it may be
1c1a0 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f   that the cost o
1c1b0 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73  f the OR-scan is
1c1c0 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20   equal to its.  
1c1d0 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78        ** most ex
1c1e0 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e  pensive sub-scan
1c1f0 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65  . Add the smalle
1c200 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61  st possible pena
1c210 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  lty .        ** 
1c220 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d  (equivalent to m
1c230 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63  ultiplying the c
1c240 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20  ost by 1.07) to 
1c250 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20  ensure that .   
1c260 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65       ** this doe
1c270 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74  s not happen. Ot
1c280 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45  herwise, for WHE
1c290 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20  RE clauses such 
1c2a0 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  as the.        *
1c2b0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72  * following wher
1c2c0 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  e there is an in
1c2d0 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20  dex on "y":.    
1c2e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1c2f0 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65  *     WHERE like
1c300 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39  lihood(x=?, 0.99
1c310 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20  ) OR y=?.       
1c320 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
1c330 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65  he planner may e
1c340 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67  lect to "OR" tog
1c350 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62  ether a full-tab
1c360 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20  le scan and an. 
1c370 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
1c380 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65  lookup. And othe
1c390 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20  r similarly odd 
1c3a0 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20  results.  */.   
1c3b0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1c3c0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  = sSum.a[i].rRun
1c3d0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   + 1;.        pN
1c3e0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e  ew->nOut = sSum.
1c3f0 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20  a[i].nOut;.     
1c400 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1c410 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72  = sSum.a[i].prer
1c420 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  eq;.        rc =
1c430 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1c440 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1c450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c460 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1c470 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69  , ("End processi
1c480 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
1c490 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
1c4a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c4b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
1c4c0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1c4d0 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
1c4e0 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
1c4f0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1c500 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
1c510 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
1c520 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
1c530 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1c540 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
1c550 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
1c560 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
1c570 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
1c580 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1c590 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
1c5a0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
1c5b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c5c0 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74  *pItem;.  struct
1c5d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c5e0 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  End = &pTabList-
1c5f0 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
1c600 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l];.  sqlite3 *d
1c610 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
1c620 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63  se->db;.  int rc
1c630 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c640 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1c650 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74  .  u8 priorJoint
1c660 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c  ype = 0;..  /* L
1c670 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
1c680 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
1c690 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1c6a0 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ght */.  pNew = 
1c6b0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1c6c0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
1c6d0 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61  pNew);.  for(iTa
1c6e0 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c  b=0, pItem=pTabL
1c6f0 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45  ist->a; pItem<pE
1c700 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65  nd; iTab++, pIte
1c710 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  m++){.    Bitmas
1c720 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b  k mUnusable = 0;
1c730 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
1c740 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
1c750 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c  ->maskSelf = sql
1c760 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
1c770 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1c780 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
1c790 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
1c7a0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
1c7b0 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29  e|priorJointype)
1c7c0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
1c7d0 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
1c7e0 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69     /* This condi
1c7f0 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65  tion is true whe
1c800 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65 20 46  n pItem is the F
1c810 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1c820 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  on the.      ** 
1c830 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20  right-hand-side 
1c840 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f  of a LEFT or CRO
1c850 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20  SS JOIN.  */.   
1c860 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
1c870 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
1c880 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49  iorJointype = pI
1c890 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
1c8a0 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
1c8b0 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1c8c0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
1c8d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c8e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70  ;.      for(p=&p
1c8f0 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b  Item[1]; p<pEnd;
1c900 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   p++){.        i
1c910 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20  f( mUnusable || 
1c920 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  (p->fg.jointype 
1c930 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
1c940 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20  OSS)) ){.       
1c950 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20     mUnusable |= 
1c960 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1c970 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1c980 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f  skSet, p->iCurso
1c990 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1c9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c9b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1c9c0 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
1c9d0 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1c9e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c9f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ca00 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1ca10 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
1ca20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1ca30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca40 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ca50 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
1ca60 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1ca70 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  le);.    }.    m
1ca80 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
1ca90 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
1caa0 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
1cab0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
1cac0 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f  .  }..  whereLoo
1cad0 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
1cae0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1caf0 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
1cb00 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
1cb10 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
1cb20 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
1cb30 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68  eLoop of the 5th
1cb40 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
1cb50 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
1cb60 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
1cb70 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
1cb80 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
1cb90 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
1cba0 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
1cbb0 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
1cbc0 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
1cbd0 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
1cbe0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1cbf0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1cc00 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1cc10 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
1cc20 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1cc30 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
1cc40 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
1cc50 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
1cc60 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
1cc70 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
1cc80 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
1cc90 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
1cca0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
1ccb0 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
1ccc0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
1ccd0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
1cce0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
1ccf0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
1cd00 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
1cd10 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
1cd20 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1cd30 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
1cd40 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
1cd50 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
1cd60 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
1cd70 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
1cd80 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
1cd90 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
1cda0 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
1cdb0 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
1cdc0 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
1cdd0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
1cde0 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
1cdf0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
1ce00 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
1ce10 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
1ce20 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
1ce30 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
1ce40 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
1ce50 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
1ce60 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
1ce70 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
1ce80 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
1ce90 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
1cea0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
1ceb0 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
1cec0 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
1ced0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1cee0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1cef0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
1cf00 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
1cf10 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
1cf20 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
1cf30 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
1cf40 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
1cf50 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
1cf60 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
1cf70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
1cf80 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
1cf90 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
1cfa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
1cfb0 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
1cfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1cfd0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1cfe0 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
1cff0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
1d000 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
1d010 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
1d020 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
1d030 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
1d040 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
1d050 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
1d060 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
1d070 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
1d080 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
1d090 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d0b0 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
1d0c0 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d0e0 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
1d0f0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
1d100 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
1d110 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
1d120 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
1d130 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
1d140 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
1d150 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
1d160 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
1d170 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
1d180 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
1d190 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
1d1a0 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
1d1b0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
1d1c0 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
1d1d0 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
1d1e0 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
1d1f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d200 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79  se */.  u16 nKey
1d210 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Col;          /*
1d220 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63   Number of key c
1d230 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
1d240 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
1d250 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n;          /* T
1d260 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
1d270 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69  rdered columns i
1d280 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
1d290 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
1d2a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d2b0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1d2c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1d2d0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
1d2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d2f0 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
1d300 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
1d310 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
1d320 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1d330 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1d340 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
1d350 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
1d360 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
1d370 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
1d380 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
1d390 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1d3a0 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
1d3b0 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
1d3c0 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
1d3d0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
1d3e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
1d3f0 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
1d400 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
1d410 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1d420 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
1d430 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1d440 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1d450 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
1d460 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1d470 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
1d480 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1d490 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1d4a0 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
1d4b0 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
1d4c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1d4d0 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
1d4e0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1d4f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1d500 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d510 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
1d520 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1d530 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
1d540 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1d550 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
1d560 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
1d570 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
1d580 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
1d590 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
1d5a0 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
1d5b0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1d5c0 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
1d5d0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
1d5e0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
1d5f0 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
1d600 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
1d610 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
1d620 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
1d630 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1d640 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
1d650 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
1d660 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
1d670 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
1d680 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
1d690 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
1d6a0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
1d6b0 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
1d6c0 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
1d6d0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
1d6e0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
1d6f0 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
1d700 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
1d710 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
1d720 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
1d730 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
1d740 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
1d750 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
1d760 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
1d770 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
1d780 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
1d790 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
1d7a0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
1d7b0 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
1d7c0 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
1d7d0 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
1d7e0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
1d7f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
1d800 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
1d810 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
1d820 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
1d830 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
1d840 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
1d850 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d860 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
1d870 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
1d880 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
1d890 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
1d8a0 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
1d8b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
1d8c0 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
1d8d0 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
1d8e0 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
1d8f0 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
1d900 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
1d910 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
1d920 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
1d930 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
1d940 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
1d950 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
1d960 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
1d970 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
1d980 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
1d990 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
1d9a0 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
1d9b0 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
1d9c0 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
1d9d0 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
1d9e0 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
1d9f0 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
1da00 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
1da10 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
1da20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
1da30 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
1da40 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
1da50 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
1da60 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
1da70 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
1da80 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
1da90 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
1daa0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1dab0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1dac0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
1dad0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1dae0 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
1daf0 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
1db00 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
1db10 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  ;.  if( nLoop &&
1db20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1db30 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1db40 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
1db50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1db60 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
1db70 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
1db80 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
1db90 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
1dba0 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
1dbb0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
1dbc0 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
1dbd0 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
1dbe0 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
1dbf0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
1dc00 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
1dc10 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
1dc20 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
1dc30 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
1dc40 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
1dc50 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
1dc60 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
1dc70 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
1dc80 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
1dc90 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
1dca0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
1dcb0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1dcc0 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
1dcd0 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
1dce0 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
1dcf0 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  st;.    if( pLoo
1dd00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1dd10 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
1dd20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
1dd30 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
1dd40 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
1dd50 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
1dd60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43  ak;.    }.    iC
1dd70 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
1dd80 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
1dd90 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
1dda0 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
1ddb0 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
1ddc0 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
1ddd0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
1dde0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
1ddf0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
1de00 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
1de10 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
1de20 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
1de30 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
1de40 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
1de50 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
1de60 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
1de70 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
1de80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
1de90 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
1dea0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1deb0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1dec0 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
1ded0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1dee0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
1def0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1df00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
1df10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1df20 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1df30 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1df40 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
1df50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1df60 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
1df70 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70  WhereFindTerm(&p
1df80 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72  WInfo->sWC, iCur
1df90 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  , pOBExpr->iColu
1dfa0 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
1dfb0 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64             ~read
1dfc0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  y, WO_EQ|WO_ISNU
1dfd0 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  LL|WO_IS, 0);.  
1dfe0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
1dff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e000 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1e010 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c  Operator&(WO_EQ|
1e020 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f  WO_IS))!=0 && pO
1e030 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
1e040 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1e050 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
1e060 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
1e070 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1e080 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
1e090 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
1e0a0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1e0b0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1e0c0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1e0d0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1e0e0 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
1e0f0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
1e100 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e110 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
1e120 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
1e130 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
1e140 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e150 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e160 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
1e170 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
1e180 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1e190 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
1e1a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e1b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
1e1d0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1e1e0 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
1e1f0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
1e200 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
1e210 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e220 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
1e230 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
1e240 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e250 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
1e260 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1e270 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
1e280 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   0;.        nCol
1e290 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  umn = 1;.      }
1e2a0 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78  else if( (pIndex
1e2b0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1e2c0 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20  e.pIndex)==0 || 
1e2d0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
1e2e0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
1e2f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
1e300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65  lse{.        nKe
1e310 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  yCol = pIndex->n
1e320 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
1e330 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  nColumn = pIndex
1e340 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
1e350 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
1e360 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c  mn==nKeyCol+1 ||
1e370 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
1e380 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20  x->pTable) );.  
1e390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1e3a0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
1e3b0 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f  Column-1]==XN_RO
1e3c0 57 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  WID.            
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
1e3e0 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
1e3f0 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
1e400 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1e410 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49  inct = IsUniqueI
1e420 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
1e430 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1e440 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
1e450 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1e460 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
1e470 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
1e480 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
1e490 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
1e4a0 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
1e4b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
1e4c0 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
1e4d0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
1e4e0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
1e4f0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
1e500 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1e510 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
1e520 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
1e530 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
1e540 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
1e550 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
1e560 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
1e570 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
1e580 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
1e590 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
1e5a0 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d  & pLoop->nSkip==
1e5b0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  0.         && ((
1e5c0 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  i = pLoop->aLTer
1e5d0 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29  m[j]->eOperator)
1e5e0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
1e5f0 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  ULL|WO_IS))!=0. 
1e600 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1e610 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49      if( i & WO_I
1e620 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
1e630 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1e640 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
1e650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
1e660 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1e670 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
1e680 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1e690 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e;  .        }..
1e6a0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
1e6b0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
1e6c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
1e6d0 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
1e6e0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1e6f0 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
1e700 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
1e710 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
1e720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e730 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
1e740 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
1e750 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1e760 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
1e770 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
1e780 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
1e790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e7a0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
1e7b0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
1e7c0 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
1e7d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e7e0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
1e7f0 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20   XN_ROWID;.     
1e800 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
1e810 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e820 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
1e830 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
1e840 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
1e850 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
1e860 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
1e870 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
1e880 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20  ll-ordered.     
1e890 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1e8a0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1e8b0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43  t.         && iC
1e8c0 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20  olumn>=0.       
1e8d0 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75    && j>=pLoop->u
1e8e0 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1e8f0 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70      && pIndex->p
1e900 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
1e910 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  umn].notNull==0.
1e920 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1e930 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1e940 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
1e950 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1e960 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42  Find the ORDER B
1e970 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72  Y term that corr
1e980 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a  esponds to the j
1e990 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  -th column.     
1e9a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64     ** of the ind
1e9b0 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  ex and mark that
1e9c0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
1e9d0 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
1e9e0 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
1e9f0 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
1ea00 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
1ea10 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
1ea20 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1ea30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1ea40 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
1ea50 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
1ea60 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
1ea70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1ea80 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
1ea90 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1eab0 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
1eac0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1ead0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
1eae0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1eaf0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
1eb00 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
1eb10 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1eb20 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
1eb30 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
1eb40 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
1eb50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1eb60 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d   if( iColumn>=(-
1eb70 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
1eb80 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
1eb90 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
1eba0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1ebb0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1ebc0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
1ebd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ebe0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1ebf0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
1ec00 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
1ec10 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1ec20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1ec30 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1ec40 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70 49 6e  pare(pOBExpr,pIn
1ec50 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
1ec60 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 29 20  [j].pExpr,iCur) 
1ec70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ec80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ec90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1eca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1ecb0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
1ecc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1ecd0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1ece0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1ecf0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1ed00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1ed10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
1ed20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1ed30 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1ed40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1ed50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ed60 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
1ed70 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
1ed80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1ed90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eda0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
1edb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1edc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1edd0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
1ede0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
1edf0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
1ee00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ee10 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1ee20 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
1ee30 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
1ee40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1ee50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
1ee60 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
1ee70 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
1ee80 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
1ee90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1eea0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
1eeb0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
1eec0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
1eed0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
1eee0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
1eef0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1ef00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1ef10 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
1ef20 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
1ef30 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
1ef40 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
1ef50 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
1ef60 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
1ef70 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
1ef80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ef90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1efa0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
1efb0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
1efc0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1efd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1efe0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
1eff0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1f000 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
1f010 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
1f020 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
1f030 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
1f040 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f050 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
1f060 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
1f070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
1f080 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
1f090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1f0a0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1f0b0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
1f0c0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
1f0d0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1f0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1f110 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
1f120 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
1f130 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
1f140 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
1f150 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1f160 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1f170 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
1f180 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1f190 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1f1a0 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
1f1b0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
1f1c0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
1f1d0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
1f1e0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
1f1f0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
1f200 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1f210 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1f220 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
1f230 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
1f240 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
1f250 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
1f260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f270 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
1f280 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
1f290 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
1f2a0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
1f2b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f2c0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
1f2d0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1f2e0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c       mTerm = sql
1f2f0 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
1f300 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
1f310 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20  kSet,p);.       
1f320 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26   if( mTerm==0 &&
1f330 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
1f340 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e  onstant(p) ) con
1f350 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1f360 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72  f( (mTerm&~order
1f370 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
1f380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
1f390 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1f3a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f3b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
1f3c0 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
1f3d0 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
1f3e0 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
1f3f0 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
1f400 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
1f410 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
1f420 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72  eturn (i8)nOrder
1f430 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64  By;.  if( !isOrd
1f440 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
1f450 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79    for(i=nOrderBy
1f460 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1f470 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
1f480 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b   MASKBIT(i) - 1;
1f490 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61  .      if( (obSa
1f4a0 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e  t&m)==m ) return
1f4b0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   i;.    }.    re
1f4c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1f4d0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn -1;.}.../*.
1f4e0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f  ** If the WHERE_
1f4f0 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
1f500 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20  set in the mask 
1f510 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1f520 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a  3WhereBegin(),.*
1f530 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73  * the planner as
1f540 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
1f550 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42  pecified pOrderB
1f560 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c  y list is actual
1f570 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59  ly a GROUP.** BY
1f580 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f   clause - and so
1f590 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20   any order that 
1f5a0 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72  groups rows as r
1f5b0 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65  equired satisfie
1f5c0 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  s the.** request
1f5d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1f5e0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  , in this case i
1f5f0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1f600 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  e for the caller
1f610 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
1f620 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f630 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61  the rows are rea
1f640 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65  lly being delive
1f650 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  red in sorted or
1f660 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20  der, or.** just 
1f670 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72  in some other or
1f680 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  der that provide
1f690 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
1f6a0 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72  rouping. However
1f6b0 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  ,.** if the WHER
1f6c0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c  E_SORTBYGROUP fl
1f6d0 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65  ag is also passe
1f6e0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1f6f0 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a  eBegin(), then.*
1f700 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1f710 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
1f720 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68   the returned Wh
1f730 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  ereInfo object. 
1f740 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72  It returns.** tr
1f750 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72  ue if the rows r
1f760 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f  eally will be so
1f770 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  rted in the spec
1f780 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20  ified order, or 
1f790 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69  false.** otherwi
1f7a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
1f7b0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a  ample, assuming:
1f7c0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
1f7d0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
1f7e0 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , Y);.**.** then
1f7f0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1f800 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
1f810 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20  BY x,y ORDER BY 
1f820 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  x,y;   -- IsSort
1f830 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c  ed()==1.**   SEL
1f840 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
1f850 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52  OUP BY y,x ORDER
1f860 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73   BY y,x;   -- Is
1f870 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69  Sorted()==0.*/.i
1f880 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
1f890 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66  sSorted(WhereInf
1f8a0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
1f8b0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
1f8c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1f8d0 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73  _GROUPBY );.  as
1f8e0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
1f8f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1f900 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a  _SORTBYGROUP );.
1f910 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
1f920 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64  >sorted;.}..#ifd
1f930 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1f940 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
1f950 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
1f960 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
1f970 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
1f980 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
1f990 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
1f9a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
1f9b0 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
1f9c0 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
1f9d0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1f9e0 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
1f9f0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
1fa00 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
1fa10 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
1fa20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
1fa30 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
1fa40 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
1fa50 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
1fa60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1fa70 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  n the cost of so
1fa80 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c  rting nRow rows,
1fa90 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
1faa0 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a  he keys have .**
1fab0 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e   nOrderby column
1fac0 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66  s and that the f
1fad0 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c  irst nSorted col
1fae0 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79  umns are already
1faf0 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f   in.** order..*/
1fb00 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
1fb10 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
1fb20 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1fb30 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e  Info,.  LogEst n
1fb40 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65  Row,.  int nOrde
1fb50 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74  rBy,.  int nSort
1fb60 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e  ed.){.  /* TUNIN
1fb70 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
1fb80 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
1fb90 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
1fba0 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20   N is .  ** the 
1fbb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
1fbc0 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a  o sort is:.  **.
1fbd0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1fbe0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1fbf0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c  ..  ** .  ** Or,
1fc00 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
1fc10 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
1fc20 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
1fc30 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65   last Y .  ** te
1fc40 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f  rms are out of o
1fc50 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b  rder, then block
1fc60 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65  -sorting will re
1fc70 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  duce the .  ** s
1fc80 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
1fc90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
1fca0 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
1fcb0 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20  g(N)) * (Y/X).  
1fcc0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58  **.  ** The (Y/X
1fcd0 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
1fce0 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
1fcf0 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
1fd00 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a  e.  ** below.  *
1fd10 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c  /.  LogEst rScal
1fd20 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
1fd30 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1fd40 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
1fd50 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
1fd60 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
1fd70 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
1fd80 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f  By-nSorted)*100/
1fd90 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
1fda0 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
1fdb0 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36  ow + rScale + 16
1fdc0 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65  ;..  /* Multiple
1fdd0 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65   by log(M) where
1fde0 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   M is the number
1fdf0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e   of output rows.
1fe00 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49  .  ** Use the LI
1fe10 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20  MIT for M if it 
1fe20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  is smaller */.  
1fe30 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1fe40 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1fe50 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26  USE_LIMIT)!=0 &&
1fe60 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c   pWInfo->iLimit<
1fe70 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77  nRow ){.    nRow
1fe80 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69   = pWInfo->iLimi
1fe90 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f  t;.  }.  rSortCo
1fea0 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f  st += estLog(nRo
1feb0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f  w);.  return rSo
1fec0 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rtCost;.}../*.**
1fed0 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
1fee0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
1fef0 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
1ff00 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
1ff10 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
1ff20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
1ff30 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
1ff40 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
1ff50 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
1ff60 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
1ff70 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
1ff80 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
1ff90 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
1ffa0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
1ffb0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
1ffc0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
1ffd0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
1ffe0 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
1fff0 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
20000 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
20010 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
20020 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
20030 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
20040 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
20050 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20060 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
20070 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
20080 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
20090 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
200a0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
200b0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
200c0 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
200d0 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
200e0 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
200f0 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
20100 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
20110 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
20120 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
20130 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
20140 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
20150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20160 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
20170 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
20180 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
20190 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
201a0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
201b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
201c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
201d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
201e0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20200 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
20210 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
20220 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
20230 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
20240 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20250 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
20260 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
20270 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20280 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
20290 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
202a0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
202b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
202c0 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
202d0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
202e0 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
202f0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
20300 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
20310 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
20320 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f  .  LogEst mxUnso
20330 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  rted = 0;    /* 
20340 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64  Maximum unsorted
20350 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
20360 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  f path */.  int 
20370 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20  nTo, nFrom;     
20380 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20390 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73  of valid entries
203a0 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46   in aTo[] and aF
203b0 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  rom[] */.  Where
203c0 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20  Path *aFrom;    
203d0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f       /* All nFro
203e0 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70  m paths at the p
203f0 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f  revious level */
20400 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54  .  WherePath *aT
20410 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
20420 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74  The nTo best pat
20430 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  hs at the curren
20440 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  t level */.  Whe
20450 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20  rePath *pFrom;  
20460 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
20470 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20  ment of aFrom[] 
20480 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
20490 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
204a0 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20  ePath *pTo;     
204b0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
204c0 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61  ent of aTo[] tha
204d0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
204e0 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   on */.  WhereLo
204f0 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20  op *pWLoop;     
20500 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
20510 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
20520 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ts */.  WhereLoo
20530 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20  p **pX;         
20540 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76    /* Used to div
20550 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20  y up the pSpace 
20560 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45  memory */.  LogE
20570 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20  st *aSortCost = 
20580 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67  0;    /* Sorting
20590 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72   and partial sor
205a0 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20  ting costs */.  
205b0 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
205c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
205d0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
205e0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
205f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ne */.  int nSpa
20600 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
20610 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
20620 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  ace allocated at
20630 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50   pSpace */..  pP
20640 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
20650 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
20660 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f  arse->db;.  nLoo
20670 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  p = pWInfo->nLev
20680 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  el;.  /* TUNING:
20690 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72   For simple quer
206a0 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65  ies, only the be
206b0 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b  st path is track
206c0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77  ed..  ** For 2-w
206d0 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20  ay joins, the 5 
206e0 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66  best paths are f
206f0 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f  ollowed..  ** Fo
20700 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20  r joins of 3 or 
20710 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61  more tables, tra
20720 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70  ck the 10 best p
20730 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69  aths */.  mxChoi
20740 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20  ce = (nLoop<=1) 
20750 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20  ? 1 : (nLoop==2 
20760 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73  ? 5 : 10);.  ass
20770 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e  ert( nLoop<=pWIn
20780 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
20790 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41  rc );.  WHERETRA
207a0 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d  CE(0x002, ("----
207b0 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20   begin solver.  
207c0 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c  (nRowEst=%d)\n",
207d0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f   nRowEst));..  /
207e0 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20  * If nRowEst is 
207f0 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69  zero and there i
20800 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
20810 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e  ause, ignore it.
20820 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
20830 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  se the purpose o
20840 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
20850 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
20860 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
20870 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74  turned.  ** by t
20880 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79  he overall query
20890 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69  . Once this esti
208a0 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62  mate has been ob
208b0 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  tained, the call
208c0 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76  er.  ** will inv
208d0 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
208e0 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c  n a second time,
208f0 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74   passing the est
20900 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a  imate as the.  *
20910 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65  * nRowEst parame
20920 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ter.  */.  if( p
20930 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
20940 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
20950 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   ){.    nOrderBy
20960 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20970 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57     nOrderBy = pW
20980 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
20990 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nExpr;.  }..  /*
209a0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
209b0 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66  itialize space f
209c0 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e  or aTo, aFrom an
209d0 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f  d aSortCost[] */
209e0 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a  .  nSpace = (siz
209f0 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
20a00 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
20a10 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
20a20 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  e*2;.  nSpace +=
20a30 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
20a40 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53  * nOrderBy;.  pS
20a50 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
20a60 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
20a70 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70  nSpace);.  if( p
20a80 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
20a90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
20aa0 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  KPT;.  aTo = (Wh
20ab0 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
20ac0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
20ad0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
20ae0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
20af0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
20b00 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
20b10 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
20b20 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
20b30 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
20b40 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
20b50 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
20b60 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
20b70 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
20b80 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42   }.  if( nOrderB
20b90 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  y ){.    /* If t
20ba0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
20bb0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
20bc0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69  t is not being i
20bd0 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20  gnored, set up. 
20be0 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20     ** space for 
20bf0 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  the aSortCost[] 
20c00 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d  array. Each elem
20c10 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74  ent of the aSort
20c20 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a  Cost array.    *
20c30 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  * is either zero
20c40 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61   - meaning it ha
20c50 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  s not yet been i
20c60 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20  nitialized - or 
20c70 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
20c80 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45  of sorting nRowE
20c90 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20  st rows of data 
20ca0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
20cb0 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a  X terms of.    *
20cc0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
20cd0 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64  lause are alread
20ce0 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72  y in order, wher
20cf0 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79  e X is the array
20d00 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20   .    ** index. 
20d10 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73   */.    aSortCos
20d20 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b  t = (LogEst*)pX;
20d30 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72  .    memset(aSor
20d40 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  tCost, 0, sizeof
20d50 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
20d60 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rBy);.  }.  asse
20d70 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30  rt( aSortCost==0
20d80 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
20d90 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f  ce]==(char*)&aSo
20da0 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d  rtCost[nOrderBy]
20db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53   );.  assert( aS
20dc0 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70  ortCost!=0 || &p
20dd0 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
20de0 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f  char*)pX );..  /
20df0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
20e00 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
20e10 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
20e20 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
20e30 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
20e40 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
20e50 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
20e60 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
20e70 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65  bove 28.  If the
20e80 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
20e90 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
20ea0 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
20eb0 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
20ec0 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a  in the first 28.
20ed0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
20ee0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
20ef0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
20f00 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
20f10 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
20f20 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29  >nQueryLoop, 48)
20f30 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73  ;  assert( 48==s
20f40 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29  qlite3LogEst(28)
20f50 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
20f60 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d  .  assert( aFrom
20f70 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30  [0].isOrdered==0
20f80 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
20f90 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
20fa0 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  nLoop is zero, t
20fb0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
20fc0 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74   FROM terms in t
20fd0 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a  he query. Since.
20fe0 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
20ff0 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61  ase the query ma
21000 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  y return a maxim
21010 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74  um of one row, t
21020 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a  he results.    *
21030 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  * are already in
21040 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f   the requested o
21050 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65  rder. Set isOrde
21060 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20  red to nOrderBy 
21070 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61  to.    ** indica
21080 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20  te this. Or, if 
21090 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72  nLoop is greater
210a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20   than zero, set 
210b0 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20  isOrdered to.   
210c0 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69   ** -1, indicati
210d0 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ng that the resu
210e0 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61  lt set may or ma
210f0 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64  y not be ordered
21100 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64  , .    ** depend
21110 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73  ing on the loops
21120 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75   added to the cu
21130 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a  rrent plan.  */.
21140 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
21150 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30  rdered = nLoop>0
21160 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79   ? -1 : nOrderBy
21170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
21180 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
21190 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
211a0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
211b0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
211c0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
211d0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
211e0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
211f0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
21200 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
21210 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
21220 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
21230 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
21240 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
21250 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
21260 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
21270 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
21280 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
21290 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
212a0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
212b0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
212c0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
212d0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
212e0 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74       LogEst nOut
212f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21300 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76         /* Rows v
21310 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d  isited by (pFrom
21320 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
21330 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
21340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21350 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
21360 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c   path (pFrom+pWL
21370 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
21380 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64  LogEst rUnsorted
21390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
213a0 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f    /* Unsorted co
213b0 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c  st of (pFrom+pWL
213c0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
213d0 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  i8 isOrdered = p
213e0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
213f0 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66    /* isOrdered f
21400 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  or (pFrom+pWLoop
21410 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
21420 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20  mask maskNew;   
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21440 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69  * Mask of src vi
21450 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f  sited by (..) */
21460 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
21470 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20   revMask = 0;   
21480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21490 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20  sk of rev-order 
214a0 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a  loops for (..) *
214b0 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  /..        if( (
214c0 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
214d0 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
214e0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
214f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
21500 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
21510 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
21520 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
21530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
21540 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
21550 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
21560 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e  X)!=0 && pFrom->
21570 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20 20 20  nRow<10 ){.     
21580 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75       /* Do not u
21590 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  se an automatic 
215a0 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68 69  index if the thi
215b0 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74  s loop is expect
215c0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
215d0 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e  to run less than
215e0 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20 20   2 times. */.   
215f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
21600 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
21610 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  (2) );.         
21620 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
21640 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
21650 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
21660 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
21670 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
21680 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
21690 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
216a0 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
216b0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
216c0 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
216d0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
216e0 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
216f0 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
21700 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
21710 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
21720 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
21730 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
21740 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
21750 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
21760 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
21770 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
21780 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
21790 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
217a0 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
217b0 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
217c0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
217d0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
217e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
217f0 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
21800 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
21810 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
21820 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
21840 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
21850 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
21860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21870 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
21880 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
21890 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
218a0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
218b0 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
218c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
218d0 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
218e0 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
218f0 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
21900 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
21910 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
21920 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
21930 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
21940 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
21950 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
21960 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43    }.          rC
21980 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
21990 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
219a0 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  , aSortCost[isOr
219b0 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20  dered]);..      
219c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
219d0 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
219e0 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
219f0 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
21a00 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
21a10 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
21a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a30 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
21a40 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
21a50 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
21a60 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
21a70 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
21a80 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
21a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21aa0 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
21ab0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rted;.        }.
21ac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
21ad0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
21ae0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
21af0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
21b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
21b10 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
21b20 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
21b30 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
21b40 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
21b50 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
21b60 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
21b70 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
21b80 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
21b90 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
21ba0 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
21bb0 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
21bc0 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
21bd0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
21be0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
21bf0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
21c00 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
21c10 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
21c20 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
21c30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
21c40 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
21c50 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
21c60 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
21c70 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
21c80 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
21c90 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
21ca0 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
21cb0 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
21cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21cd0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
21ce0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
21cf0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
21d00 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
21d10 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
21d20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
21d30 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
21d40 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
21d50 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
21d60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21d70 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
21d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
21d90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
21da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21db0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
21dc0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
21dd0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
21de0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
21df0 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
21e00 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
21e10 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21e20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
21e30 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
21e40 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
21e50 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
21e60 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
21e70 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
21e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21e90 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
21ea0 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
21eb0 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
21ec0 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
21ed0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
21ee0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
21ef0 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
21f00 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
21f10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21f20 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
21f30 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
21f40 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
21f50 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
21f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21f70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
21f80 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
21f90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21fa0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
21fb0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
21fc0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
21fd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21fe0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21ff0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
22000 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
22010 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
22020 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22030 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
22040 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
22050 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
22060 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
22070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22090 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
220a0 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65  his points it me
220b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77  ans that the new
220c0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a   candidate path.
220d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
220e0 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ds to be added t
220f0 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
22100 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20  t-so-far paths. 
22110 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
22120 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
22130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22140 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
22150 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
22160 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
22170 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
22180 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
22190 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
221a0 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
221b0 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
221c0 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
221d0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
221e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
221f0 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
22200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22210 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
22220 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22230 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
22240 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
22250 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
22260 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
22270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22280 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
22290 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
222a0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
222b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
222c0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
222d0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
222e0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
222f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
22300 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
22310 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
22320 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
22330 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22350 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
22360 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62  eaches here if b
22370 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20  est-so-far path 
22380 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65  pTo=aTo[jj] cove
22390 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rs the.         
223a0 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20   ** same set of 
223b0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
223c0 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20  e sam isOrdered 
223d0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20  setting as the. 
223e0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64           ** cand
223f0 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65  idate path.  Che
22400 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
22410 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
22420 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  d replace.      
22430 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66      ** pTo or if
22440 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
22450 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
22460 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22470 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
22480 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73  st || (pTo->rCos
22490 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t==rCost && pTo-
224a0 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a  >nRow<=nOut) ){.
224b0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
224c0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
224d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
224e0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
224f0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
22500 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22510 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
22540 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
22550 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
22560 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
22570 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
22580 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
22590 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
225a0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
225b0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
225c0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
225e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
225f0 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
22600 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63  %-3d,%d order=%c
22610 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22620 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
22630 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
22640 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
22650 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
22680 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
22690 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
226a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
226b0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
226c0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
226d0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72  andidate path fr
226e0 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69  om further consi
226f0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  deration */.    
22700 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22710 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
22720 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
22730 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22750 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
22760 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
22770 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
22780 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
22790 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e   here if the can
227a0 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62  didate path is b
227b0 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  etter than the. 
227c0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20           ** pTo 
227d0 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70  path.  Replace p
227e0 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64  To with the cand
227f0 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66  idate. */.#ifdef
22800 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
22810 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
22820 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22830 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
22840 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
22850 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22860 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
22870 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
22880 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
22890 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
228a0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
228b0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
228c0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
228d0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
228e0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
228f0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
22900 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
22910 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22920 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22930 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
22940 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
22950 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22960 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
22970 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
22980 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
22990 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
229a0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
229b0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
229c0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
229d0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
229e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
229f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
22a00 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
22a10 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
22a20 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
22a30 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
22a40 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
22a50 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
22a60 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
22a70 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
22a80 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
22a90 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
22aa0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
22ab0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
22ac0 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
22ad0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
22ae0 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
22af0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
22b00 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
22b10 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
22b20 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
22b30 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
22b40 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
22b50 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
22b60 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
22b70 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
22b80 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
22b90 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
22ba0 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
22bb0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
22bc0 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
22bd0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
22be0 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
22bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
22c00 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
22c10 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
22c20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
22c30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
22c40 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
22c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
22c60 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
22c70 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
22c80 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
22c90 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
22ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22cb0 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
22cc0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
22cd0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
22ce0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
22cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
22d00 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
22d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22d20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22d30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
22d40 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
22d50 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
22d60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
22d70 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
22d80 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
22d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
22da0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
22db0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
22dc0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
22dd0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
22de0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
22df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22e00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
22e10 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
22e20 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
22e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
22e40 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
22e50 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
22e60 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
22e70 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
22e80 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
22e90 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
22ea0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
22eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
22ec0 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
22ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22ee0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
22ef0 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
22f00 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
22f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22f30 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
22f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f50 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
22f60 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
22f70 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
22f80 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
22f90 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
22fa0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
22fb0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
22fc0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
22fd0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
22fe0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
22ff0 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
23000 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23010 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
23020 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
23030 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23040 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
23050 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23060 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
23070 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
23080 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
23090 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
230a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
230b0 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
230c0 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
230d0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
230e0 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
230f0 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
23100 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
23110 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
23120 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
23130 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
23140 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
23150 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
23160 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
23170 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
23180 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
23190 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
231a0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
231b0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
231c0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
231d0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
231e0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
231f0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
23200 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
23210 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
23220 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
23230 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
23240 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
23250 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
23260 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
23270 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
23280 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
23290 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
232a0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
232b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
232c0 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
232d0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
232e0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
232f0 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
23300 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
23310 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
23320 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
23330 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
23340 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
23350 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
23360 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  Set, pFrom,.    
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
23380 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
23390 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
233a0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
233b0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
233c0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52  ( rc==pWInfo->pR
233d0 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20  esultSet->nExpr 
233e0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
233f0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
23400 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
23410 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
23420 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
23430 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
23440 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23450 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
23460 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
23470 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
23480 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
23490 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
234a0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
234b0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
234c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
234d0 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
234e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
234f0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
23500 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
23510 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
23520 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57  o->nOBSat<0 ) pW
23530 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
23540 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
23550 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
23560 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
23570 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
23580 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
23590 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
235a0 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
235b0 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
235c0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
235d0 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20  xpr && nLoop>0. 
235e0 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d     ){.      Bitm
235f0 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
23600 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
23610 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  r = wherePathSat
23620 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
23630 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
23640 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
23650 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f     pFrom, 0, nLo
23660 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
23670 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65  op[nLoop-1], &re
23680 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20  vMask.      );. 
23690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
236a0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29  nfo->sorted==0 )
236b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  ;.      if( nOrd
236c0 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er==pWInfo->pOrd
236d0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
236e0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73         pWInfo->s
236f0 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  orted = 1;.     
23700 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
23710 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  sk = revMask;.  
23720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23730 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
23740 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
23750 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
23760 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
23770 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
23780 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
23790 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
237a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
237b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
237c0 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
237d0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
237e0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
237f0 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
23800 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
23810 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
23820 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
23830 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
23840 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
23850 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
23860 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
23870 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
23880 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
23890 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
238a0 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
238b0 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
238c0 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
238d0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
238e0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
238f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
23900 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
23910 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
23920 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
23930 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
23940 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
23950 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
23960 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
23970 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
23980 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
23990 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
239a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
239b0 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
239c0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
239d0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
239e0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
239f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23a00 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
23a10 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
23a20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
23a30 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
23a40 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
23a50 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
23a60 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
23a70 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
23a80 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
23a90 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
23aa0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23ab0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
23ac0 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
23ad0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
23ae0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23af0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
23b00 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
23b10 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
23b20 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
23b30 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
23b40 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
23b50 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
23b60 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
23b70 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
23b80 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
23b90 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
23ba0 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
23bb0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
23bc0 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
23bd0 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
23be0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
23bf0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
23c00 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
23c10 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
23c20 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
23c30 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
23c40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23c50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23c60 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
23c70 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
23c80 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
23c90 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
23ca0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
23cb0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
23cc0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
23cd0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
23ce0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
23cf0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
23d00 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
23d10 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
23d20 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
23d30 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
23d40 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
23d50 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
23d60 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
23d70 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
23d80 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
23d90 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
23da0 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
23db0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
23dc0 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
23dd0 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
23de0 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
23df0 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
23e00 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
23e10 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
23e20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
23e30 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
23e40 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
23e50 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
23e60 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
23e70 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
23e80 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
23e90 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
23ea0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
23eb0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
23ec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
23ed0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
23ee0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
23ef0 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
23f00 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
23f10 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
23f20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
23f30 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
23f40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
23f50 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
23f60 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
23f70 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
23f80 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
23f90 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
23fa0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
23fb0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
23fc0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
23fd0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
23fe0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
23ff0 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
24000 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
24010 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
24020 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
24030 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
24040 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
24050 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
24060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
24070 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
24080 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
24090 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
240a0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
240b0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
240c0 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
240d0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
240e0 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
240f0 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
24100 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
24110 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
24120 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
24130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24140 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
24150 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
24160 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
24170 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
24180 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
24190 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
241a0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
241b0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
241c0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
241d0 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
241e0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
241f0 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
24200 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
24210 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
24220 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
24230 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
24240 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e  BSat =  pWInfo->
24250 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24260 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
24270 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
24280 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
24290 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
242a0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
242b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
242c0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
242d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
242e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
242f0 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
24300 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
24310 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24320 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
24330 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24340 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
24350 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
24360 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
24370 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
24380 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
24390 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
243a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
243b0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
243c0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
243d0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
243e0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
243f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
24400 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
24410 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
24420 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
24430 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
24440 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
24450 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
24460 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
24470 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
24480 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
24490 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
244a0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
244b0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
244c0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
244d0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
244e0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
244f0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
24500 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
24510 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
24520 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
24530 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
24540 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
24550 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
24560 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
24570 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
24580 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
24590 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
245a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
245b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
245c0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
245d0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
245e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
245f0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
24600 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
24610 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
24620 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
24630 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
24640 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
24650 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
24660 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
24670 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
24680 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
24690 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
246a0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
246b0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
246c0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
246d0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
246e0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
246f0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
24700 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
24730 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
24740 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
24770 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
24780 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
24790 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
247a0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
247b0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
247c0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
247d0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
247e0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
247f0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
24800 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
24810 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
24820 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
24830 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
24840 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
24850 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
24860 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
24870 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
24880 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
24890 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
248a0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
248b0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
248c0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
248d0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
248e0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
248f0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
24900 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
24910 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
24920 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
24930 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
24940 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
24950 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
24960 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
24970 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
24980 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
24990 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
249a0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
249b0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
249c0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
249d0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
249e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
249f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
24a00 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
24a10 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
24a20 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
24a30 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
24a40 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
24a50 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
24a60 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
24a70 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
24a80 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
24a90 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
24aa0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
24ab0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
24ac0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
24ad0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
24ae0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
24af0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
24b00 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
24b10 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
24b20 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
24b30 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
24b40 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
24b50 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
24b60 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
24b70 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
24b80 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
24b90 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
24ba0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
24bb0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
24bc0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
24bd0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
24be0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
24bf0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
24c00 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
24c10 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
24c20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
24c30 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
24c40 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
24c50 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
24c60 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
24c70 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
24c80 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
24c90 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
24ca0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
24cb0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
24cc0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
24cd0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
24ce0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
24cf0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
24d00 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
24d10 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
24d20 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
24d30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24d40 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
24d50 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
24d60 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
24d70 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
24d80 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
24d90 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
24da0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
24db0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
24dc0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
24dd0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
24de0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
24df0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
24e00 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
24e10 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
24e20 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
24e30 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
24e40 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
24e50 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
24e60 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
24e70 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
24e80 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
24e90 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
24ea0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
24eb0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
24ec0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
24ed0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
24ee0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
24ef0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
24f00 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
24f10 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
24f20 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
24f30 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
24f40 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
24f50 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
24f60 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
24f70 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
24f80 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
24f90 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
24fa0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
24fb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
24fc0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
24fd0 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
24fe0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
24ff0 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
25000 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
25010 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
25020 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
25030 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
25040 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
25050 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
25060 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
25070 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
25080 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
25090 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
250a0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
250b0 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
250c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
250d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
250e0 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
250f0 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  .** WHERE_ONETAB
25100 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
25110 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
25120 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
25130 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
25140 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
25150 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
25160 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
25170 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
25180 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
25190 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
251a0 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
251b0 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
251c0 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
251d0 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
251e0 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
251f0 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
25200 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
25210 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
25220 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
25230 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
25240 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
25250 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
25260 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
25270 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
25280 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
25290 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
252a0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
252b0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
252c0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
252d0 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
252e0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
252f0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
25300 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
25310 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
25320 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
25330 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
25340 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
25350 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
25360 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
25370 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
25380 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
25390 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
253a0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
253b0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
253c0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
253d0 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
253e0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
253f0 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
25400 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20  int iAuxArg     
25410 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
25420 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
25430 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
25440 72 73 6f 72 20 6e 75 6d 62 65 72 2c 0a 20 20 20  rsor number,.   
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45       ** If WHERE
25470 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e  _USE_LIMIT, then
25480 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e   the limit amoun
25490 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  t */.){.  int nB
254a0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
254b0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
254c0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
254d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
254e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
254f0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
25500 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
25510 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
25520 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
25530 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
25540 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
25550 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
25560 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
25570 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
25580 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
25590 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
255a0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
255b0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
255c0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
255d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
255e0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
255f0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
25600 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
25610 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
25620 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
25630 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
25640 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
25650 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
25660 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
25670 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
25680 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
25690 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
256a0 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
256b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
256c0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
256d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
256e0 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
256f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
25700 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
25710 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25720 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
25730 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
25740 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
25750 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
25760 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25780 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25790 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65  .  u8 bFordelete
257a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
257b0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
257c0 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70  E or zero, as ap
257d0 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20  propriate */..  
257e0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
257f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
25800 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
25810 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
25820 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25830 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
25840 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
25850 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
25860 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
25870 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
25880 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20   /* Only one of 
25890 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
258a0 4e 4c 59 20 6f 72 20 57 48 45 52 45 5f 55 53 45  NLY or WHERE_USE
258b0 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65  _LIMIT */.  asse
258c0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
258d0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
258e0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
258f0 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
25900 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
25910 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20  _LIMIT)==0 );.. 
25920 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
25930 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
25940 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
25950 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
25960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
25970 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
25980 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
25990 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
259a0 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
259b0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
259c0 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
259d0 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
259e0 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
259f0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
25a00 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
25a10 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
25a20 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
25a30 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
25a40 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
25a50 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
25a60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
25a70 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
25a80 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
25a90 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
25aa0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
25ab0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
25ac0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
25ad0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
25ae0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
25af0 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
25b00 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
25b10 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
25b20 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
25b30 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
25b40 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
25b50 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
25b60 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
25b70 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
25b80 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
25b90 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
25ba0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
25bb0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
25bc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
25bd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25be0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25bf0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
25c00 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
25c10 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
25c20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
25c30 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
25c40 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
25c50 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
25c60 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
25c70 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
25c80 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
25c90 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
25ca0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
25cb0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
25cc0 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
25cd0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
25ce0 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
25cf0 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
25d00 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
25d10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
25d20 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
25d30 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
25d40 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
25d50 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
25d60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
25d70 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
25d80 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
25d90 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
25da0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
25db0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
25dc0 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
25dd0 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
25de0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
25df0 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
25e00 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
25e10 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
25e20 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
25e30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25e40 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
25e50 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
25e60 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
25e70 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
25e80 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
25e90 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
25ea0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
25eb0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
25ec0 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
25ed0 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
25ee0 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
25ef0 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
25f00 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
25f10 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
25f20 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
25f30 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
25f40 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
25f50 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
25f60 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
25f70 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
25f80 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
25f90 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
25fa0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
25fb0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
25fc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25fd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
25fe0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25ff0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
26000 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
26010 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
26020 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
26030 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
26040 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
26050 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
26060 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
26070 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
26080 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
26090 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
260a0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
260b0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
260c0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
260d0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
260e0 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
260f0 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
26100 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
26110 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
26120 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
26130 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
26140 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
26150 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
26160 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69  Info->iLimit = i
26170 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f  AuxArg;.  pWInfo
26180 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
26190 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
261a0 72 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74  ryLoop;.  assert
261b0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
261c0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
261d0 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64  );  /* ONEPASS d
261e0 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a  efaults to OFF *
261f0 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  /.  pMaskSet = &
26200 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
26210 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
26220 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
26230 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
26240 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
26250 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
26260 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
26270 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
26280 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
26290 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
262a0 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
262b0 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
262c0 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
262d0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
262e0 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
262f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
26300 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
26310 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
26320 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
26330 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
26340 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
26350 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
26360 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
26370 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
26380 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
26390 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
263a0 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
263b0 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
263c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
263d0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
263e0 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
263f0 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
26400 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
26410 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
26420 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
26430 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
26440 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
26450 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
26460 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
26470 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
26480 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
26490 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
264a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
264b0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
264c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
264d0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
264e0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
264f0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
26500 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26510 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
26520 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
26530 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26550 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
26560 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
26570 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
26580 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
26590 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
265a0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
265b0 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
265c0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
265d0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
265e0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
265f0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
26600 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
26610 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
26620 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26630 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
26640 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
26650 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
26660 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
26670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26680 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
26690 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
266a0 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
266b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
266c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
266d0 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
266e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
266f0 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
26700 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a  sk of 1<<N..  **
26710 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f  .  ** The rule o
26720 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
26730 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
26740 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
26750 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a   bitmask for.  *
26760 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65  * a table T, the
26770 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69 74  n X-1 is the bit
26780 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68  mask for all oth
26790 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  er tables to the
267a0 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a   left of T..  **
267b0 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
267c0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
267d0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
267e0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
267f0 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74  s.  ** important
26800 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
26810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
26820 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
26830 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
26840 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
26850 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
26860 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
26870 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
26880 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
26890 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
268a0 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
268b0 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
268c0 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
268d0 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
268e0 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
268f0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
26900 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
26910 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
26920 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
26930 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
26940 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
26950 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
26960 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
26970 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
26980 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
26990 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
269a0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
269b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
269c0 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b  EBUG.  for(ii=0;
269d0 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
269e0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42  rc; ii++){.    B
269f0 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
26a00 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
26a10 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
26a20 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
26a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
26a40 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b  ==MASKBIT(ii) );
26a50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
26a60 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
26a70 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
26a80 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
26a90 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
26aa0 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
26ab0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
26ac0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26ad0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
26ae0 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ginError;..  if(
26af0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
26b00 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
26b10 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
26b20 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
26b30 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
26b40 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
26b50 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
26b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
26b70 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
26b80 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
26b90 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
26ba0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
26bb0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
26bc0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
26bd0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
26be0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
26bf0 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
26c00 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
26c10 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
26c20 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
26c30 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
26c40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
26c50 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
26c60 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
26c70 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52  o->pOrderBy = pR
26c80 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a  esultSet;.    }.
26c90 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
26ca0 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
26cb0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  p objects */.#if
26cc0 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
26cd0 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
26ce0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26cf0 72 61 63 65 20 26 20 30 78 66 66 66 66 20 29 7b  race & 0xffff ){
26d00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26d10 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74  gPrintf("*** Opt
26d20 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
26d30 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78   (wctrlFlags: 0x
26d40 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b  %x",wctrlFlags);
26d50 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
26d60 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
26d70 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73  LIMIT ){.      s
26d80 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26d90 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c  f(", limit: %d",
26da0 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d   iAuxArg);.    }
26db0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26dc0 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a  gPrintf(")\n");.
26dd0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
26de0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26df0 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
26e00 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
26e10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26e20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
26e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c    for(i=0; i<sWL
26e40 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  B.pWC->nTerm; i+
26e50 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
26e60 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70  ermPrint(&sWLB.p
26e70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
26e80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
26e90 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
26ea0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
26eb0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
26ec0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
26ed0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
26ee0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26ef0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
26f00 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
26f10 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26f20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26f30 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
26f40 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
26f50 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
26f60 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
26f70 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
26f80 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
26f90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26fa0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
26fb0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
26fc0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
26fd0 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
27010 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
27020 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
27030 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
27040 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
27050 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
27060 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
27070 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
27080 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
27090 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
270a0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
270b0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
270c0 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
270d0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
270e0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
270f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
27100 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
27110 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
27120 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
27130 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
27140 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
27150 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
27160 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
27170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27180 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
27190 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
271a0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
271b0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
271c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
271d0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
271e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
271f0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42  fo->revMask = (B
27200 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d  itmask)(-1);.  }
27210 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
27220 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
27230 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
27240 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
27250 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
27260 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
27270 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
27280 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
27290 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
272a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
272b0 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
272c0 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
272d0 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
272e0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
272f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27300 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
27310 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
27320 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
27330 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
27340 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
27350 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
27360 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
27370 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
27380 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
27390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
273a0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
273b0 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
273c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
273d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
273e0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
273f0 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
27400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27410 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
27420 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
27430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27440 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
27450 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
27460 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
27470 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27480 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
27490 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
274a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
274b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
274c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
274d0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
274e0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
274f0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
27500 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
27510 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
27520 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
27530 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
27540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
27550 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
27560 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
27570 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
27580 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
27590 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
275a0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
275b0 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
275c0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
275d0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
275e0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
275f0 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
27600 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
27610 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
27620 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
27630 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
27640 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
27650 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
27660 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
27670 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
27680 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
27690 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
276a0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
276b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
276c0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
276d0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
276e0 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
276f0 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
27700 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
27710 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
27720 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27730 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
27740 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
27750 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
27760 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
27770 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27780 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
27790 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
277a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
277b0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
277c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
277d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
277e0 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
277f0 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
27800 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
27810 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
27820 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
27830 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
27840 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
27850 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
27860 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
27870 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
27880 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
27890 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
278a0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
278b0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
278c0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
278d0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
278e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
278f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27910 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
27920 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27930 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
27940 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
27950 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
27960 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
27970 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
27980 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
27990 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
279a0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
279b0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
279c0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
279d0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
279e0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
279f0 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
27a00 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
27a10 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
27a20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
27a30 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
27a40 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
27a50 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
27a60 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
27a70 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
27a80 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
27a90 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61  priate..  */.  a
27aa0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
27ab0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27ac0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
27ad0 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
27ae0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
27af0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27b00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
27b10 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
27b20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f  wsFlags = pWInfo
27b30 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
27b40 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  sFlags;.    int 
27b50 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61  bOnerow = (wsFla
27b60 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
27b70 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62  W)!=0;.    if( b
27b80 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28  Onerow.     || (
27b90 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
27ba0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
27bb0 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20  IROW)!=0.       
27bc0 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61      && 0==(wsFla
27bd0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
27be0 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b  ALTABLE)).    ){
27bf0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
27c00 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
27c10 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
27c20 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
27c30 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
27c40 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
27c50 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
27c60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27c70 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
27c80 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
27c90 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
27ca0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
27cb0 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
27cc0 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
27cd0 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
27ce0 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
27cf0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
27d00 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
27d10 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
27d20 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
27d30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
27d40 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
27d50 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
27d60 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
27d70 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
27d80 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
27d90 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
27da0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
27db0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
27dc0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
27dd0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
27de0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
27df0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
27e00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
27e10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27e20 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
27e30 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
27e40 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
27e50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27e60 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
27e70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
27e80 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
27e90 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
27ea0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
27eb0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
27ec0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
27ed0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
27ee0 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
27ef0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
27f00 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
27f10 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
27f20 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
27f30 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
27f40 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
27f50 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
27f60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27f70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
27f80 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
27f90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27fa0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
27fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
27fc0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
27fd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
27fe0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
27ff0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
28000 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
28010 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
28020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28030 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
28040 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
28050 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
28060 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
28070 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
28080 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
28090 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
280a0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
280b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
280c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
280d0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
280e0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
280f0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
28100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
28110 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
28120 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
28130 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
28140 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
28150 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
28160 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
28170 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
28180 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49  ePass[0] = pTabI
28190 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
281a0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c      };.      sql
281b0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
281c0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
281d0 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
281e0 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61  ab, op);.      a
281f0 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
28200 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c  >iCursor==pLevel
28210 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20  ->iTabCur );.   
28220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
28230 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
28240 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54  NEPASS_OFF && pT
28250 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
28260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28270 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  e( pWInfo->eOneP
28280 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
28290 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
282a0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
282b0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
282c0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
282d0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
282e0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
282f0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  b) ){.        Bi
28300 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
28310 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
28320 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
28330 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
28340 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
28350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28360 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
28370 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  1, SQLITE_INT_TO
28380 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
28390 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
283a0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
283b0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  l );.      }.#if
283c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
283d0 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
283e0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
283f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
28400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
28410 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
28420 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  (v, OPFLAG_SEEKE
28430 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  Q|bFordelete);. 
28440 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
28450 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
28460 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28470 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c  ngeP5(v, bFordel
28480 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ete);.      }.#i
28490 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
284a0 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
284b0 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ASK.      sqlite
284c0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
284d0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
284e0 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  d, pTabItem->iCu
284f0 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  rsor, 0, 0,.    
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75          (const u
28520 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f  8*)&pTabItem->co
28530 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
28540 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
28550 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28560 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
28570 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
28580 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
28590 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
285a0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
285b0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
285c0 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  D ){.      Index
285d0 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   *pIx = pLoop->u
285e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
285f0 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43       int iIndexC
28600 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  ur;.      int op
28610 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
28620 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67        /* iAuxArg
28630 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69   is always set i
28640 66 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20  f to a positive 
28650 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53  value if ONEPASS
28660 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   is possible */.
28670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41        assert( iA
28680 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49  uxArg!=0 || (pWI
28690 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
286a0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
286b0 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20  DESIRED)==0 );. 
286c0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
286d0 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
286e0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
286f0 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63  x).       && (wc
28700 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28710 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
28720 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
28730 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f      /* This is o
28740 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52  ne term of an OR
28750 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73  -optimization us
28760 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20  ing the PRIMARY 
28770 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20  KEY of a.       
28780 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49   ** WITHOUT ROWI
28790 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65  D table.  No nee
287a0 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65  d for a separate
287b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
287c0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c    iIndexCur = pL
287d0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20  evel->iTabCur;. 
287e0 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20         op = 0;. 
287f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
28800 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
28810 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
28820 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
28830 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  J = pTabItem->pT
28840 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
28850 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
28860 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
28870 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
28880 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
28890 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20  ASS_DESIRED );. 
288a0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c         while( AL
288b0 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d  WAYS(pJ) && pJ!=
288c0 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pIx ){.         
288d0 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20   iIndexCur++;.  
288e0 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d          pJ = pJ-
288f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
28900 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  }.        op = O
28910 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
28920 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
28930 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69  urOnePass[1] = i
28940 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
28950 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72  }else if( iAuxAr
28960 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  g && (wctrlFlags
28970 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
28980 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  E_ONLY)!=0 ){.  
28990 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
289a0 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20  = iAuxArg;.     
289b0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
289c0 73 20 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e  s & WHERE_REOPEN
289d0 5f 49 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52  _IDX ) op = OP_R
289e0 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20  eopenIdx;.      
289f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28a00 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73  IndexCur = pPars
28a10 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
28a20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
28a30 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65  >iIdxCur = iInde
28a40 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
28a50 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
28a60 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
28a70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28a80 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b   iIndexCur>=0 );
28a90 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b  .      if( op ){
28aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ab0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
28ac0 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
28ad0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
28ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28af0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
28b00 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
28b10 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
28b20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28b30 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20  CONSTRAINT)!=0. 
28b40 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
28b50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
28b60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28b70 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29  |WHERE_SKIPSCAN)
28b80 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
28b90 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
28ba0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
28bb0 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20  BY_MIN)==0.     
28bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28bd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
28be0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
28bf0 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74  EKEQ); /* Hint t
28c00 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20  o COMDB2 */.    
28c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64      }.        Vd
28c20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
28c30 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
28c40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
28c50 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
28c60 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20  ED_MASK.        
28c70 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20  {.          u64 
28c80 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20  colUsed = 0;.   
28c90 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a         int ii, j
28ca0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  j;.          for
28cb0 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e  (ii=0; ii<pIx->n
28cc0 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
28cd0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
28ce0 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69  pIx->aiColumn[ii
28cf0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
28d00 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e  f( jj<0 ) contin
28d10 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
28d20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d  if( jj>63 ) jj =
28d30 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20   63;.           
28d40 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e   if( (pTabItem->
28d50 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
28d60 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74  T(jj))==0 ) cont
28d70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
28d80 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75    colUsed |= ((u
28d90 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20  64)1)<<(ii<63 ? 
28da0 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20  ii : 63);.      
28db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28dd0 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
28de0 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43  mnsUsed, iIndexC
28df0 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ur, 0, 0,.      
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e10 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26            (u8*)&
28e20 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
28e30 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  4);.        }.#e
28e40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
28e50 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
28e60 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20  D_MASK */.      
28e70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
28e80 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33  iDb>=0 ) sqlite3
28e90 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
28ea0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
28eb0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
28ec0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
28ed0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
28ee0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
28ef0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
28f00 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
28f10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
28f20 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
28f30 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
28f40 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
28f50 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
28f60 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
28f70 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
28f80 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
28f90 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
28fa0 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
28fb0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
28fc0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
28fd0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
28fe0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78  {.    int addrEx
28ff0 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77  plain;.    int w
29000 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
29010 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
29020 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  ii];.    wsFlags
29030 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
29040 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e  p->wsFlags;.#ifn
29050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29060 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
29070 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
29080 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
29090 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
290a0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
290b0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
290c0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
290d0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
290f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
29100 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
29110 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
29120 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
29130 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
29140 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29150 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
29160 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d     addrExplain =
29170 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
29180 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
29190 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
291a0 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
291b0 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
291c0 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20  , wctrlFlags.   
291d0 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
291e0 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74  addrBody = sqlit
291f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
29200 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  r(v);.    notRea
29210 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  dy = sqlite3Wher
29220 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72  eCodeOneLoopStar
29230 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
29240 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
29250 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
29260 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
29270 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c  t;.    if( (wsFl
29280 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
29290 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c  OR)==0 && (wctrl
292a0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
292b0 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  ABLE_ONLY)==0 ){
292c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
292d0 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
292e0 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
292f0 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
29300 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
29310 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
29320 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
29330 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
29340 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
29350 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
29360 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
29370 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
29380 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
29390 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
293a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
293b0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
293c0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
293d0 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
293e0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
293f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
29410 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
29420 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
29430 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
29440 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
29450 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
29460 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
29470 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
29480 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
29490 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
294a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
294b0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
294c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
294d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
294e0 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
294f0 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65  l *pLevel;.  Whe
29500 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
29510 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29520 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
29530 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
29540 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
29550 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
29560 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
29570 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
29580 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
29590 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
295a0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69  -core"));.  sqli
295b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
295c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
295d0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
295e0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
295f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
29600 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
29610 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
29620 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
29630 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74  WLoop;.    sqlit
29640 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
29650 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
29660 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
29670 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
29680 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
29690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
296a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
296b0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
296c0 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p2, pLevel->p
296d0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
296e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
296f0 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
29700 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29710 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
29720 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
29730 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74  vel->op==OP_Next
29740 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29750 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
29760 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b  l->op==OP_Prev);
29770 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
29780 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
29790 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a  >op==OP_VNext);.
297a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
297b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
297c0 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
297d0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
297e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
297f0 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
29800 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
29810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
29820 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
29830 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
29840 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
29850 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
29860 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
29870 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
29880 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
29890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
298a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
298b0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
298c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
298d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
298e0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
298f0 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
29900 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
29910 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29920 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
29930 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
29940 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
29950 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a  OP_PrevIfOpen);.
29960 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
29970 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
29980 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65  EndLoopOp==OP_Ne
29990 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  xtIfOpen);.     
299a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
299b0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
299c0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
299d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
299e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
299f0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
29a00 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
29a10 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
29a20 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Skip ){.      sq
29a30 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
29a40 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
29a50 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
29a60 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
29a70 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
29a80 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
29a90 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  .pIndex->zName))
29aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29ab0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
29ac0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
29ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29ae0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
29af0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d  Level->addrSkip-
29b00 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  2);.    }.#ifnde
29b10 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f  f SQLITE_LIKE_DO
29b20 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53  ESNT_MATCH_BLOBS
29b30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
29b40 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a  >addrLikeRep ){.
29b50 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20        int op;.  
29b60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
29b70 64 62 65 47 65 74 4f 70 28 76 2c 20 70 4c 65 76  dbeGetOp(v, pLev
29b80 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 2d  el->addrLikeRep-
29b90 31 29 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20  1)->p1 ){.      
29ba0 20 20 6f 70 20 3d 20 4f 50 5f 44 65 63 72 4a 75    op = OP_DecrJu
29bb0 6d 70 5a 65 72 6f 3b 0a 20 20 20 20 20 20 7d 65  mpZero;.      }e
29bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  lse{.        op 
29bd0 3d 20 4f 50 5f 4a 75 6d 70 5a 65 72 6f 49 6e 63  = OP_JumpZeroInc
29be0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
29bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29c00 70 32 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c  p2(v, op, pLevel
29c10 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 2c 20  ->iLikeRepCntr, 
29c20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
29c30 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Rep);.      Vdbe
29c40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
29c50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
29c60 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
29c70 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64  oin ){.      add
29c80 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
29c90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
29ca0 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
29cb0 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  Join); VdbeCover
29cc0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73  age(v);.      as
29cd0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
29ce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
29cf0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
29d00 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
29d10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
29d20 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
29d30 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
29d40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29d50 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
29d60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29d70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
29d80 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
29d90 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
29da0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
29db0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
29dc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
29dd0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
29de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29df0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
29e00 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
29e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29e20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
29e30 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
29e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
29e60 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
29e70 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
29e80 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
29e90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29ea0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
29eb0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
29ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
29ed0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
29ee0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
29ef0 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
29f00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
29f10 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
29f20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
29f40 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
29f50 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
29f60 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29f70 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
29f80 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
29f90 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
29fa0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
29fb0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
29fc0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
29fd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29fe0 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
29ff0 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
2a000 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2a010 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
2a020 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
2a030 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2a040 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
2a050 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
2a060 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  ++){.    int k, 
2a070 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70  last;.    VdbeOp
2a080 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78   *pOp;.    Index
2a090 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
2a0a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a0b0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
2a0c0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2a0d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2a0e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2a0f0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2a100 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2a110 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
2a120 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2a130 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  ;..    /* For a 
2a140 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e  co-routine, chan
2a150 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e  ge all OP_Column
2a160 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2a170 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2a180 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  ** the co-routin
2a190 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f  e into OP_Copy o
2a1a0 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  f result contain
2a1b0 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
2a1c0 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69  ..    ** OP_Rowi
2a1d0 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c  d becomes OP_Nul
2a1e0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
2a1f0 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76  ( pTabItem->fg.v
2a200 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21  iaCoroutine && !
2a210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2a220 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c   ){.      transl
2a230 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
2a240 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
2a250 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
2a260 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
2a290 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
2a2a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2a2b0 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  ..    /* Close a
2a2c0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
2a2d0 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
2a2e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
2a2f0 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20  reBegin..    ** 
2a300 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63  Except, do not c
2a310 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68 61  lose cursors tha
2a320 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64  t will be reused
2a330 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d   by the OR optim
2a340 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28  ization.    ** (
2a350 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
2a360 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20  CLOSE).  And do 
2a370 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50  not close the OP
2a380 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f  _OpenWrite curso
2a390 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  rs.    ** create
2a3a0 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53  d for the ONEPAS
2a3b0 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  S optimization..
2a3c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2a3d0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2a3e0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
2a3f0 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
2a400 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
2a410 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2a420 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a430 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
2a440 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
2a450 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
2a460 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
2a470 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2a480 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2a490 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
2a4a0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
2a4b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a4c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2a4d0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
2a4e0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2a4f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73   }.      if( (ws
2a500 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2a510 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
2a520 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  ws & (WHERE_IPK|
2a530 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
2a540 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ))==0 .       &&
2a550 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2a560 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  !=pWInfo->aiCurO
2a570 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20  nePass[1].      
2a580 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2a590 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2a5a0 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
2a5b0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
2a5c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2a5d0 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
2a5e0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
2a5f0 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
2a600 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
2a610 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
2a620 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
2a630 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
2a640 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
2a650 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
2a660 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68   cases.    ** th
2a670 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2a680 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62  prevents the tab
2a690 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69  le from ever bei
2a6a0 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63  ng read, which c
2a6b0 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20  an.    ** yield 
2a6c0 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65  a significant pe
2a6d0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
2a6e0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
2a6f0 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
2a700 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
2a710 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
2a720 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
2a730 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
2a740 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
2a750 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
2a760 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
2a770 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
2a780 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
2a790 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
2a7a0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
2a7b0 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
2a7c0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
2a7d0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
2a7e0 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
2a7f0 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
2a800 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
2a810 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
2a820 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2a830 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2a840 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
2a850 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
2a860 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
2a870 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
2a880 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
2a890 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2a8a0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
2a8b0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
2a8c0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
2a8d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2a8e0 64 78 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  dx.     && (pWIn
2a8f0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2a900 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61  EPASS_OFF || !Ha
2a910 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61  sRowid(pIdx->pTa
2a920 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21 64  ble)).     && !d
2a930 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
2a940 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73      ){.      las
2a950 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2a960 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2a970 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d       k = pLevel-
2a980 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20  >addrBody;.     
2a990 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2a9a0 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20  beGetOp(v, k);. 
2a9b0 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73       for(; k<las
2a9c0 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
2a9d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
2a9e0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
2a9f0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
2aa00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2aa10 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
2aa20 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2aa30 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32   int x = pOp->p2
2aa40 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2aa50 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  rt( pIdx->pTable
2aa60 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
2aa70 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2aa80 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
2aa90 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
2aaa0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
2aab0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
2aac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20  ;.            x 
2aad0 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
2aae0 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x];.            
2aaf0 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a  assert( x>=0 );.
2ab00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ab10 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
2ab20 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
2ab30 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  Idx, x);.       
2ab40 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
2ab50 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2ab60 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  p2 = x;.        
2ab70 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
2ab80 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
2ab90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2aba0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
2abb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2abc0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2abd0 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20  0 || x>=0 );.   
2abe0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2abf0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
2ac00 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
2ac10 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
2ac20 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2ac30 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
2ac40 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
2ac50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ac60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ac70 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
2ac80 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
2ac90 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2aca0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2acb0 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
2acc0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
2acd0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.