/ Hex Artifact Content
Login

Artifact 56948ada5aacc3bf2628db3776986e8bf4085383:


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 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
18b60 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
18b70 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
18b80 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
18b90 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
18ba0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
18bb0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
18bc0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
18bd0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
18be0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
18bf0 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54  here are no LEFT
18c00 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a   or CROSS JOIN j
18c10 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  oins in the quer
18c20 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20 61  y, both mExtra a
18c30 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  nd.** mUnusable 
18c40 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74  are set to 0. Ot
18c50 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61 20  herwise, mExtra 
18c60 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c  is a mask of all
18c70 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
18c80 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
18c90 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69  ur before the vi
18ca0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74  rtual table in t
18cb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
18cc0 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61  nd are.** separa
18cd0 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61  ted from it by a
18ce0 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54  t least one LEFT
18cf0 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20   or CROSS JOIN. 
18d00 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a  Similarly, the.*
18d10 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b  * mUnusable mask
18d20 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52   contains all FR
18d30 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65  OM clause entrie
18d40 73 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74  s that occur aft
18d50 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  er the.** virtua
18d60 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20  l table and are 
18d70 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
18d80 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
18d90 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52  e LEFT or .** CR
18da0 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a  OSS JOIN. .**.**
18db0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
18dc0 20 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a   the query were:
18dd0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
18de0 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f  M t1, t2 LEFT JO
18df0 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52  IN t3, t4, vt CR
18e00 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b  OSS JOIN t5, t6;
18e10 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74  .**.** then mExt
18e20 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ra corresponds t
18e30 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
18e40 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
18e50 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
18e60 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 45  the tables in mE
18e70 78 74 72 61 20 6d 75 73 74 20 62 65 20 73 63 61  xtra must be sca
18e80 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nned before the 
18e90 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  current virtual 
18ea0 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e  .** table. So an
18eb0 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
18ec0 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69  h all prerequisi
18ed0 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65  tes are satisfie
18ee0 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20  d by .** mExtra 
18ef0 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64  may be specified
18f00 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20   as "usable" in 
18f10 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  all calls to xBe
18f20 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e  stIndex. .** Con
18f30 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62  versely, all tab
18f40 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65  les in mUnusable
18f50 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
18f60 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
18f70 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  nt.** virtual ta
18f80 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d  ble, so any term
18f90 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
18fa0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76  prerequisites ov
18fb0 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55  erlap with.** mU
18fc0 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61  nusable should a
18fd0 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75  lways be configu
18fe0 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62  red as "not-usab
18ff0 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64  le" for xBestInd
19000 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
19010 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
19020 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
19030 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
19040 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
19050 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
19060 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
19070 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
19080 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
19090 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
190a0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f  ed before this o
190b0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
190c0 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20  mUnusable       
190d0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
190e0 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
190f0 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f  ned after this o
19100 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ne */.){.  Where
19110 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
19120 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
19130 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
19140 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
19150 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
19160 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
19170 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19180 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
19190 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
191a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
191b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
191c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
191d0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
191e0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
191f0 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
19200 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
19210 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
19220 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
19230 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
19240 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19250 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
19260 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
19270 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
19280 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
19290 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
192a0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
192b0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
192c0 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
192d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
192e0 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
192f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19300 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
19310 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
19320 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
19330 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
19340 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
19350 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
19360 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
19370 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19390 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
193a0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
193b0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
193c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
193d0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
193e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
193f0 72 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d 55  rt( (mExtra & mU
19400 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20  nusable)==0 );. 
19410 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
19420 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
19430 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
19440 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
19450 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
19460 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
19470 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
19480 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
19490 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
194a0 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
194b0 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
194c0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
194d0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
194e0 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
194f0 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
19500 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
19510 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53  C, mUnusable, pS
19520 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rc,pBuilder->pOr
19530 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49  derBy);.  if( pI
19540 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  dxInfo==0 ) retu
19550 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
19560 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 72  BKPT;.  pNew->pr
19570 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ereq = 0;.  pNew
19580 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19590 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
195a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
195b0 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  LE;.  pNew->nLTe
195c0 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rm = 0;.  pNew->
195d0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
195e0 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  = 0;.  pUsage = 
195f0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
19600 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43  raintUsage;.  nC
19610 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
19620 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
19630 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  t;.  if( whereLo
19640 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
19650 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
19660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
19670 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
19680 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
19690 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
196a0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
196b0 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
196c0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
196d0 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
196e0 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
196f0 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
19700 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
19710 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
19720 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
19730 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
19740 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
19750 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
19760 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19770 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
19780 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
19790 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
197a0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
197b0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
197c0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
197d0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
197e0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
197f0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
19800 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
19810 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
19820 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
19830 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
19840 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
19850 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
19860 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
19870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
19880 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
19890 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
198a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
198b0 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
198c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
198d0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
198e0 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
198f0 78 74 72 61 29 21 3d 30 20 29 7b 0a 20 20 20 20  xtra)!=0 ){.    
19900 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
19910 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
19920 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
19930 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
19940 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
19950 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
19960 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
19970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19990 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
199a0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
199b0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
199c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
199d0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
199e0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
199f0 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
19a00 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
19a10 78 74 72 61 29 3d 3d 30 3b 0a 20 20 20 20 20 20  xtra)==0;.      
19a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19a30 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a     case 2:    /*
19a40 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f   Variables witho
19a50 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ut IN */.       
19a60 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
19a70 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar );.          
19a80 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
19a90 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72   = (pTerm->eOper
19aa0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
19ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
19ac0 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
19ad0 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  lt:   /* Variabl
19ae0 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20  es with IN */.  
19af0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19b00 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49  seenVar && seenI
19b10 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
19b20 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19b30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
19b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19b50 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
19b60 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
19b70 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
19b80 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
19b90 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t);.    if( pIdx
19ba0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19bb0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
19bc0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
19bd0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64  idxStr);.    pId
19be0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
19bf0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
19c00 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20  >idxNum = 0;.   
19c10 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19c20 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
19c30 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  .    pIdxInfo->o
19c40 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
19c50 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19c60 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
19c70 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
19c80 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
19c90 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
19ca0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
19cb0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
19cc0 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  xFlags = 0;.    
19cd0 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65  pIdxInfo->colUse
19ce0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  d = (sqlite3_int
19cf0 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  64)pSrc->colUsed
19d00 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42  ;.    rc = vtabB
19d10 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
19d20 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29   pTab, pIdxInfo)
19d30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
19d40 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
19d50 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70  Vtab_exit;.    p
19d60 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
19d70 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
19d80 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
19d90 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
19da0 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  aint;.    pNew->
19db0 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
19dc0 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
19dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
19de0 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
19df0 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66  straint );.    f
19e00 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
19e10 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77  raint; i++) pNew
19e20 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b  ->aLTerm[i] = 0;
19e30 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  .    pNew->u.vta
19e40 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
19e50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19e60 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
19e70 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
19e80 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
19e90 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
19ea0 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
19eb0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78          j = pIdx
19ec0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
19ed0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  t;.        if( i
19ee0 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
19ef0 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c  t.         || j<
19f00 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e  0.         || j>
19f10 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
19f20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
19f30 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
19f40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
19f50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19f60 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
19f70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19f80 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65  (pParse, "%s.xBe
19f90 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e  stIndex() malfun
19fa0 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ction", pTab->zN
19fb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
19fc0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
19fd0 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
19fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
19ff0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
1a000 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
1a010 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a020 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
1a030 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
1a040 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
1a050 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
1a060 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
1a070 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1a080 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
1a090 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
1a0a0 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
1a0b0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
1a0c0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1a0d0 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
1a0e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
1a0f0 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54  erm>mxTerm ) mxT
1a100 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20  erm = iTerm;.   
1a110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1a120 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
1a130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1a140 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
1a150 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
1a160 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
1a170 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
1a180 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
1a190 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
1a1a0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1a1b0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
1a1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1a1d0 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
1a1e0 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
1a1f0 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
1a200 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
1a210 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
1a220 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
1a230 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
1a240 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
1a250 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
1a260 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
1a270 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
1a280 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
1a290 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32  .          ** (2
1a2b0 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75  ) Multiple outpu
1a2c0 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ts from a single
1a2d0 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e   IN value will n
1a2e0 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20  ot merge.       
1a2f0 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
1a300 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
1a310 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a320 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
1a330 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a340 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51  >idxFlags &= ~SQ
1a350 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
1a360 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20  UNIQUE;.        
1a370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a380 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73      if( i>=nCons
1a390 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  traint ){.      
1a3a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d  pNew->nLTerm = m
1a3b0 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61  xTerm+1;.      a
1a3c0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54  ssert( pNew->nLT
1a3d0 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  erm<=pNew->nLSlo
1a3e0 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
1a3f0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1a400 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1a410 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  m;.      pNew->u
1a420 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1a430 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1a440 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20  oFreeIdxStr;.   
1a450 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
1a460 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
1a470 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  0;.      pNew->u
1a480 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70  .vtab.idxStr = p
1a490 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b  IdxInfo->idxStr;
1a4a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
1a4b0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1a4c0 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1a4d0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1a4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a510 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1a520 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1a530 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
1a540 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1a550 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62  e3LogEstFromDoub
1a560 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  le(pIdxInfo->est
1a570 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20  imatedCost);.   
1a580 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1a590 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49  sqlite3LogEst(pI
1a5a0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1a5b0 64 52 6f 77 73 29 3b 0a 0a 20 20 20 20 20 20 2f  dRows);..      /
1a5c0 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1a5d0 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1a5e0 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1a5f0 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1a600 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
1a610 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
1a620 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72  it at most one r
1a630 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68  ow. Clear it oth
1a640 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 20 20 20  erwise. */.     
1a650 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69   if( pIdxInfo->i
1a660 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  dxFlags & SQLITE
1a670 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
1a680 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  UE ){.        pN
1a690 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
1a6a0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
1a6b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a6c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1a6d0 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57  &= ~WHERE_ONEROW
1a6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a6f0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1a700 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1a710 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
1a720 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1a730 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a740 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
1a750 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1a760 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76         pNew->u.v
1a770 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1a780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a790 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70    }  ..whereLoop
1a7a0 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20  AddVtab_exit:.  
1a7b0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
1a7c0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1a7d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
1a7e0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
1a7f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a800 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
1a810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1a820 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a830 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a840 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
1a850 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
1a860 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
1a870 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
1a880 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
1a890 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
1a8a0 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
1a8b0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1a8c0 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c  pAddOr(.  WhereL
1a8d0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1a8e0 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b  lder, .  Bitmask
1a8f0 20 6d 45 78 74 72 61 2c 20 0a 20 20 42 69 74 6d   mExtra, .  Bitm
1a900 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b  ask mUnusable.){
1a910 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1a920 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1a930 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
1a940 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
1a950 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1a960 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1a970 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
1a980 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a990 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
1a9a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
1a9b0 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1a9c0 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
1a9d0 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
1a9e0 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
1a9f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1aa00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
1aa10 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1aa20 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  WC;.  pWCEnd = p
1aa30 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
1aa40 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
1aa50 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
1aa60 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
1aa70 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
1aa80 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
1aa90 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
1aaa0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75  New->iTab;.  iCu
1aab0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
1aac0 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
1aad0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
1aae0 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
1aaf0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
1ab00 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
1ab10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1ab20 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
1ab30 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
1ab40 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
1ab50 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
1ab60 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
1ab70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
1ab80 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
1ab90 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
1aba0 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
1abb0 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
1abc0 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
1abd0 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
1abe0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1abf0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
1ac00 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1ac10 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
1ac20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
1ac30 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
1ac40 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1ac50 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1ac60 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1ac70 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
1ac80 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1ac90 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72  x200, ("Begin pr
1aca0 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
1acb0 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
1acc0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  );.      for(pOr
1acd0 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
1ace0 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
1acf0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
1ad00 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
1ad10 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1ad20 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
1ad30 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1ad40 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
1ad50 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
1ad60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ad70 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
1ad80 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
1ad90 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1ada0 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
1adb0 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
1adc0 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
1add0 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
1ade0 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
1adf0 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
1ae00 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
1ae10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1ae20 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
1ae30 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1ae40 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
1ae50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ae60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1ae70 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1ae80 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
1ae90 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1aea0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
1aeb0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1aec0 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20  x200, ("OR-term 
1aed0 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20  %d of %p has %d 
1aee0 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20  subterms:\n", . 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d    (int)(pOrTerm-
1af10 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d  pOrWC->a), pTerm
1af20 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  , sSubBuild.pWC-
1af30 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  >nTerm));.      
1af40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
1af50 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20  reTrace & 0x400 
1af60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
1af70 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c  (i=0; i<sSubBuil
1af80 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  d.pWC->nTerm; i+
1af90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1afa0 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26  whereTermPrint(&
1afb0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61  sSubBuild.pWC->a
1afc0 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  [i], i);.       
1afd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
1afe0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1aff0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1b000 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
1b010 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1b020 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1b030 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1b040 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
1b050 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
1b060 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  ra, mUnusable);.
1b070 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1b080 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1b090 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1b0a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1b0b0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
1b0c0 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
1b0d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b0f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1b100 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
1b110 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55  uild, mExtra, mU
1b120 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1b130 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1b140 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1b150 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
1b160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
1b170 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
1b180 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1b190 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b1a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b1b0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
1b1c0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1b1d0 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
1b1e0 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
1b1f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1b200 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68  se{.          Wh
1b210 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a  ereOrSet sPrev;.
1b220 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1b230 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
1b240 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
1b250 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1b260 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b270 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
1b280 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1b290 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
1b2a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1b2b0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
1b2c0 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
1b2d0 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
1b2e0 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b310 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1b320 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
1b330 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b360 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
1b370 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
1b380 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
1b390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b3a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b3c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
1b3d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
1b3e0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
1b3f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1b400 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
1b410 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
1b420 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1b430 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1b440 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
1b450 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
1b460 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
1b470 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
1b480 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1b490 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
1b4a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
1b4b0 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79  UNING: Currently
1b4c0 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
1b4d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
1b4e0 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  m of the costs. 
1b4f0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c         ** of all
1b500 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69   sub-scans requi
1b510 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63  red by the OR-sc
1b520 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65  an. However, due
1b530 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20   to rounding.   
1b540 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20       ** errors, 
1b550 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  it may be that t
1b560 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f  he cost of the O
1b570 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20  R-scan is equal 
1b580 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  to its.        *
1b590 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  * most expensive
1b5a0 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74   sub-scan. Add t
1b5b0 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  he smallest poss
1b5c0 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20  ible penalty .  
1b5d0 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61        ** (equiva
1b5e0 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79  lent to multiply
1b5f0 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20  ing the cost by 
1b600 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20  1.07) to ensure 
1b610 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  that .        **
1b620 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68   this does not h
1b630 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65  appen. Otherwise
1b640 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  , for WHERE clau
1b650 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a  ses such as the.
1b660 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
1b670 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65  wing where there
1b680 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1b690 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  "y":.        **.
1b6a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57          **     W
1b6b0 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1b6c0 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d  x=?, 0.99) OR y=
1b6d0 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ?.        **.   
1b6e0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e       ** the plan
1b6f0 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f  ner may elect to
1b700 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61   "OR" together a
1b710 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
1b720 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20   and an.        
1b730 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e  ** index lookup.
1b740 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c   And other simil
1b750 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73  arly odd results
1b760 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
1b770 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
1b780 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20  a[i].rRun + 1;. 
1b790 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1b7a0 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
1b7b0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
1b7c0 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
1b7d0 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
1b7e0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b7f0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1b800 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1b810 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
1b820 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64  ACE(0x200, ("End
1b830 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
1b840 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
1b850 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rm));.    }.  }.
1b860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b870 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
1b880 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1b890 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a  for all tables .
1b8a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1b8b0 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68  ereLoopAddAll(Wh
1b8c0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1b8d0 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
1b8e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1b8f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1b900 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  o;.  Bitmask mEx
1b910 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61  tra = 0;.  Bitma
1b920 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20  sk mPrior = 0;. 
1b930 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63   int iTab;.  Src
1b940 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
1b950 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1b960 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1b970 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b980 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b990 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26  t_item *pEnd = &
1b9a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e  pTabList->a[pWIn
1b9b0 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73  fo->nLevel];.  s
1b9c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
1b9d0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1b9e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b9f0 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
1ba00 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70  op *pNew;.  u8 p
1ba10 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30  riorJointype = 0
1ba20 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
1ba30 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
1ba40 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
1ba50 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
1ba60 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1ba70 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65  r->pNew;.  where
1ba80 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a  LoopInit(pNew);.
1ba90 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
1baa0 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
1bab0 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61   pItem<pEnd; iTa
1bac0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
1bad0 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73     Bitmask mUnus
1bae0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e  able = 0;.    pN
1baf0 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
1bb00 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
1bb10 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65  elf = sqlite3Whe
1bb20 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1bb30 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
1bb40 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1bb50 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66    if( ((pItem->f
1bb60 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  g.jointype|prior
1bb70 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f  Jointype) & (JT_
1bb80 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
1bb90 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1bba0 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
1bbb0 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d   true when pItem
1bbc0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   is the FROM cla
1bbd0 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a  use term on the.
1bbe0 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68        ** right-h
1bbf0 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45  and-side of a LE
1bc00 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1bc10 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 45 78 74  .  */.      mExt
1bc20 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20  ra = mPrior;.   
1bc30 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e   }.    priorJoin
1bc40 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67  type = pItem->fg
1bc50 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  .jointype;.    i
1bc60 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1bc70 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1bc80 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1bc90 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20  t_item *p;.     
1bca0 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d   for(p=&pItem[1]
1bcb0 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
1bcc0 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75          if( mUnu
1bcd0 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e  sable || (p->fg.
1bce0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1bcf0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29  EFT|JT_CROSS)) )
1bd00 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75  {.          mUnu
1bd10 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33  sable |= sqlite3
1bd20 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1bd30 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1bd40 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  p->iCursor);.   
1bd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bd60 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bd70 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
1bd80 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20  uilder, mExtra, 
1bd90 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1bda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1bdb0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1bdc0 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ree(pBuilder, mE
1bdd0 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
1bde0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bdf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1be00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1be10 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1be20 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1be30 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
1be40 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
1be50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
1be60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1be70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
1be80 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
1be90 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
1bea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1beb0 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
1bec0 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
1bed0 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
1bee0 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
1bef0 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
1bf00 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
1bf10 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
1bf20 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
1bf30 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
1bf40 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
1bf50 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
1bf60 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
1bf70 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
1bf80 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
1bf90 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
1bfa0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bfb0 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
1bfc0 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
1bfd0 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
1bfe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1bff0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1c000 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
1c010 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
1c020 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
1c030 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
1c040 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
1c050 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
1c060 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
1c070 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
1c080 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
1c090 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
1c0a0 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
1c0b0 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
1c0c0 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
1c0d0 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
1c0e0 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
1c0f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
1c100 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
1c110 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
1c120 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
1c130 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
1c140 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
1c150 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c160 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
1c170 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72   as equivalent r
1c180 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
1c190 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
1c1a0 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
1c1b0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
1c1c0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1c1d0 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
1c1e0 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
1c1f0 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
1c200 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
1c210 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
1c220 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
1c230 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
1c240 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
1c250 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
1c260 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
1c270 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1c280 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1c290 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1c2a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1c2b0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
1c2c0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
1c2d0 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
1c2e0 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
1c2f0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
1c300 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
1c310 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
1c320 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
1c330 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63        /* Might c
1c340 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f  ontain WHERE_GRO
1c350 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49  UPBY or WHERE_DI
1c360 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31  STINCTBY */.  u1
1c370 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
1c380 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c390 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
1c3a0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1c3b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
1c3c0 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
1c3d0 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
1c3e0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
1c3f0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
1c400 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
1c410 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
1c420 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
1c430 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
1c440 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
1c450 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
1c460 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c470 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
1c480 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
1c490 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
1c4a0 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
1c4b0 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
1c4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c4d0 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
1c4e0 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
1c4f0 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
1c500 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
1c510 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
1c520 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
1c530 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
1c540 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
1c550 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
1c560 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
1c570 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
1c580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
1c590 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
1c5a0 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
1c5b0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1c5c0 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   u16 nKeyCol;   
1c5d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c5e0 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20   of key columns 
1c5f0 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75  in pIndex */.  u
1c600 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 nColumn;     
1c610 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1c620 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20  mber of ordered 
1c630 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
1c640 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f  ndex */.  u16 nO
1c650 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1c660 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20  /* Number terms 
1c670 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1c680 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1c690 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
1c6a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68    /* Index of Wh
1c6b0 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68  ereLoop in pPath
1c6c0 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
1c6d0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1c6f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1c700 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
1c710 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1c720 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72  r number for cur
1c730 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  rent WhereLoop *
1c740 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
1c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
1c760 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
1c770 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a  hin table iCur *
1c780 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1c790 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72  Loop = 0; /* Cur
1c7a0 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62  rent WhereLoop b
1c7b0 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20  eing processed. 
1c7c0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1c7d0 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20  pTerm;     /* A 
1c7e0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
1c7f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c800 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78  */.  Expr *pOBEx
1c810 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  pr;        /* An
1c820 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
1c830 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c840 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ause */.  CollSe
1c850 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
1c860 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74  /* COLLATE funct
1c870 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45  ion from an ORDE
1c880 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1c890 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1c8a0 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  dex;        /* T
1c8b0 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  he index associa
1c8c0 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a  ted with pLoop *
1c8d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1c8e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1c8f0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
1c900 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1c910 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74  .  Bitmask obSat
1c920 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b   = 0;    /* Mask
1c930 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
1c940 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20  ms satisfied so 
1c950 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  far */.  Bitmask
1c960 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f   obDone;       /
1c970 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52  * Mask of all OR
1c980 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
1c990 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44    Bitmask orderD
1c9a0 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a  istinctMask;  /*
1c9b0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c   Mask of all wel
1c9c0 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20  l-ordered loops 
1c9d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61  */.  Bitmask rea
1c9e0 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
1c9f0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65   /* Mask of inne
1ca00 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a  r loops */..  /*
1ca10 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
1ca20 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
1ca30 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65  ne-row" if it ge
1ca40 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20  nerates no more 
1ca50 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f  than one.  ** ro
1ca60 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20  w of output.  A 
1ca70 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65  WhereLoop is one
1ca80 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74  -row if all of t
1ca90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1caa0 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29   true:.  **  (a)
1cab0 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   All index colum
1cac0 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48  ns match with WH
1cad0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20  ERE_COLUMN_EQ.. 
1cae0 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64   **  (b) The ind
1caf0 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a  ex is unique.  *
1cb00 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20  * Any WhereLoop 
1cb10 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f  with an WHERE_CO
1cb20 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69  LUMN_EQ constrai
1cb30 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  nt on the rowid 
1cb40 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a  is one-row..  **
1cb50 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
1cb60 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61  hereLoop will ha
1cb70 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  ve the WHERE_ONE
1cb80 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77  ROW bit set in w
1cb90 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a  sFlags..  **.  *
1cba0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1cbb0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72  reLoop is "order
1cbc0 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68  -distinct" if th
1cbd0 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  e set of columns
1cbe0 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20   from.  ** that 
1cbf0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61  WhereLoop that a
1cc00 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  re in the ORDER 
1cc10 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69  BY clause are di
1cc20 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
1cc30 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1cc40 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76  e WhereLoop.  Ev
1cc50 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
1cc60 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74  eLoop is automat
1cc70 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65  ically.  ** orde
1cc80 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20  r-distinct.   A 
1cc90 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68  WhereLoop that h
1cca0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  as no columns in
1ccb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1ccc0 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ause.  ** is not
1ccd0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1cce0 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
1ccf0 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69  tinct is not qui
1cd00 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62  te the same as b
1cd10 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45  eing.  ** UNIQUE
1cd20 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20   since a UNIQUE 
1cd30 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20  column or index 
1cd40 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
1cd50 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a  e rows that .  *
1cd60 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e  * are NULL and N
1cd70 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65  ULL values are e
1cd80 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68  quivalent for th
1cd90 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64  e purpose of ord
1cda0 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1cdb0 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  * To be order-di
1cdc0 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75  stinct, the colu
1cdd0 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51  mns must be UNIQ
1cde0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e  UE and NOT NULL.
1cdf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
1ce00 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65  owid for a table
1ce10 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55   is always UNIQU
1ce20 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73  E and NOT NULL s
1ce30 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20  o whenever the. 
1ce40 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72   ** rowid appear
1ce50 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1ce60 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  Y clause, the co
1ce70 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
1ce80 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75  eLoop is.  ** au
1ce90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65  tomatically orde
1cea0 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f  r-distinct..  */
1ceb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
1cec0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  erBy!=0 );.  if(
1ced0 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69   nLoop && Optimi
1cee0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1cef0 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
1cf00 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75  yIdxJoin) ) retu
1cf10 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42  rn 0;..  nOrderB
1cf20 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1cf30 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  xpr;.  testcase(
1cf40 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31   nOrderBy==BMS-1
1cf50 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
1cf60 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72  By>BMS-1 ) retur
1cf70 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  n 0;  /* Cannot 
1cf80 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20  optimize overly 
1cf90 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20  large ORDER BYs 
1cfa0 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74  */.  isOrderDist
1cfb0 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f  inct = 1;.  obDo
1cfc0 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72  ne = MASKBIT(nOr
1cfd0 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65  derBy)-1;.  orde
1cfe0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20  rDistinctMask = 
1cff0 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a  0;.  ready = 0;.
1d000 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
1d010 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26  sOrderDistinct &
1d020 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26  & obSat<obDone &
1d030 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20  & iLoop<=nLoop; 
1d040 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  iLoop++){.    if
1d050 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64  ( iLoop>0 ) read
1d060 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  y |= pLoop->mask
1d070 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  Self;.    pLoop 
1d080 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20  = iLoop<nLoop ? 
1d090 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
1d0a0 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20  op] : pLast;.   
1d0b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1d0c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1d0d0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
1d0e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76    if( pLoop->u.v
1d0f0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20  tab.isOrdered ) 
1d100 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a  obSat = obDone;.
1d110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d120 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
1d130 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1d140 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
1d150 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
1d160 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
1d170 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
1d180 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
1d190 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
1d1a0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
1d1b0 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
1d1c0 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
1d1d0 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
1d1e0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
1d1f0 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
1d200 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
1d210 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
1d220 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
1d230 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1d240 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
1d250 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
1d260 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1d270 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d280 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
1d290 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1d2a0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
1d2b0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1d2c0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
1d2d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
1d2e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1d2f0 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
1d300 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
1d310 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
1d320 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
1d330 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
1d340 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
1d350 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
1d380 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1d390 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  S, 0);.      if(
1d3a0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
1d3b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1d3c0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1d3d0 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29  r&(WO_EQ|WO_IS))
1d3e0 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
1d3f0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
1d400 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d410 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
1d420 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1d430 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1d440 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
1d450 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1d460 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
1d470 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1d480 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1d490 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
1d4a0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
1d4b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1d4c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1d4d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
1d4e0 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
1d4f0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d500 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d510 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d520 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
1d530 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
1d540 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d550 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
1d560 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
1d570 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1d580 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1d590 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1d5a0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
1d5b0 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
1d5c0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1d5d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1d5e0 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
1d5f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1d600 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1d610 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1d620 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
1d630 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
1d640 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
1d650 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d660 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
1d670 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1d680 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
1d690 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
1d6a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1d6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d6c0 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
1d6d0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
1d6e0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
1d6f0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
1d700 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
1d710 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
1d720 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
1d730 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
1d740 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
1d750 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
1d760 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
1d770 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20  1]==XN_ROWID.   
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
1d7a0 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
1d7b0 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  le));.        is
1d7c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d7d0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1d7e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
1d7f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
1d800 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e  rough all column
1d810 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1d820 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  nd deal with the
1d830 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   ones.      ** t
1d840 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  hat are not cons
1d850 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72  trained by == or
1d860 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IN..      */.  
1d870 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74      rev = revSet
1d880 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74   = 0;.      dist
1d890 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b  inctColumns = 0;
1d8a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
1d8b0 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  j<nColumn; j++){
1d8c0 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63  .        u8 bOnc
1d8d0 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  e;   /* True to 
1d8e0 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  run the ORDER BY
1d8f0 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a   search loop */.
1d900 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  .        /* Skip
1d910 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
1d920 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20  NULL terms */.  
1d930 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
1d940 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
1d950 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70          && pLoop
1d960 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  ->nSkip==0.     
1d970 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
1d980 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
1d990 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
1d9a0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
1d9b0 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
1d9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d9d0 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
1d9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
1d9f0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
1da00 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1da10 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1da20 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1da30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da40 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
1da50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1da60 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
1da70 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
1da80 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
1da90 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
1daa0 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
1dab0 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
1dac0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1dad0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
1dae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
1daf0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
1db00 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
1db10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
1db20 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
1db30 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
1db40 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
1db50 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1db60 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
1db70 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
1db80 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1db90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dba0 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57  iColumn = XN_ROW
1dbb0 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ID;.          re
1dbc0 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
1dbd0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1dbe0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
1dbf0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
1dc00 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
1dc10 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
1dc20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
1dc30 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
1dc40 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
1dc50 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
1dc60 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
1dc70 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
1dc80 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
1dc90 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
1dca0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
1dcb0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1dcc0 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
1dcd0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
1dce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
1dcf0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1dd00 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dd10 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
1dd20 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
1dd30 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1dd40 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
1dd50 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
1dd60 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
1dd70 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
1dd80 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
1dd90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dda0 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
1ddb0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
1ddc0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1ddd0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
1dde0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
1ddf0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1de00 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1de10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1de20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
1de30 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1de40 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
1de50 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1de60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1de70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1de80 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
1de90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1dea0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1deb0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
1dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ded0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
1dee0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
1def0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
1df00 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
1df10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1df20 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20  olumn>=(-1) ){. 
1df30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1df40 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
1df50 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
1df60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1df70 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
1df80 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
1df90 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1dfa0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
1dfb0 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
1dfc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1dfd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dfe0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1dff0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f  e3ExprCompare(pO
1e000 42 45 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43  BExpr,pIndex->aC
1e010 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
1e020 70 72 2c 69 43 75 72 29 20 29 7b 0a 20 20 20 20  pr,iCur) ){.    
1e030 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e040 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e050 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e060 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1e070 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1e080 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1e090 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1e0a0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1e0b0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
1e0c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1e0d0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1e0e0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1e0f0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1e100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1e110 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1e120 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
1e130 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
1e140 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1e150 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
1e160 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
1e170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1e190 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
1e1a0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1e1b0 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
1e1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
1e1d0 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
1e1e0 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
1e1f0 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
1e200 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
1e210 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
1e220 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
1e230 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
1e240 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
1e250 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
1e260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1e270 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
1e280 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
1e290 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
1e2a0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
1e2b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e2c0 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
1e2d0 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
1e2e0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e300 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
1e310 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
1e320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1e330 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
1e340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e350 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
1e360 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
1e370 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
1e380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1e390 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
1e3a0 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
1e3b0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1e3c0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
1e3d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e3e0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1e3f0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
1e400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e410 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
1e420 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
1e430 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
1e440 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  <nKeyCol ){.    
1e450 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e460 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1e470 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1e480 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e490 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1e4a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
1e4b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1e4c0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
1e4d0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1e4e0 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
1e4f0 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
1e500 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
1e510 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
1e520 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
1e530 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
1e540 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
1e550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
1e560 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
1e570 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
1e580 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
1e590 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
1e5a0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
1e5b0 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
1e5c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1e5d0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
1e5e0 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
1e5f0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
1e600 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1e610 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1e620 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e630 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
1e640 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  k mTerm;.       
1e650 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1e660 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1e670 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
1e680 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1e690 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54  Expr;.        mT
1e6a0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
1e6b0 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49  reExprUsage(&pWI
1e6c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
1e6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1e6e0 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
1e6f0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1e700 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
1e710 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
1e720 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
1e730 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
1e740 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
1e750 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1e760 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e770 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
1e780 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
1e790 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
1e7a0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
1e7b0 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
1e7c0 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
1e7d0 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
1e7e0 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
1e7f0 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
1e800 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
1e810 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
1e820 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
1e830 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
1e840 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
1e850 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
1e860 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
1e870 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
1e880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1e890 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
1e8a0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
1e8b0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
1e8c0 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
1e8d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1e8e0 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
1e8f0 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
1e900 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
1e910 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
1e920 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
1e930 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
1e940 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
1e950 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
1e960 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
1e970 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
1e980 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
1e990 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
1e9a0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1e9b0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
1e9c0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
1e9d0 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
1e9e0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
1e9f0 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
1ea00 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
1ea10 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
1ea20 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
1ea30 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
1ea40 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
1ea50 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
1ea60 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
1ea70 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
1ea80 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
1ea90 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
1eaa0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1eab0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
1eac0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
1ead0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
1eae0 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
1eaf0 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
1eb00 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
1eb10 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
1eb20 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
1eb30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
1eb40 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
1eb50 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
1eb60 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1eb70 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
1eb80 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1eb90 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
1eba0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
1ebb0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ebc0 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
1ebd0 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
1ebe0 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
1ebf0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1ec00 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
1ec10 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
1ec20 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
1ec30 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
1ec40 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
1ec50 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
1ec60 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
1ec70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1ec80 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
1ec90 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
1eca0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1ecb0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
1ecc0 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
1ecd0 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
1ece0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
1ecf0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
1ed00 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
1ed10 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
1ed20 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1ed30 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
1ed40 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1ed50 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
1ed60 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
1ed70 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
1ed80 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
1ed90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
1eda0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
1edb0 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
1edc0 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
1edd0 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
1ede0 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
1edf0 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
1ee00 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
1ee10 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
1ee20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1ee30 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
1ee40 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
1ee50 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
1ee60 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
1ee70 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
1ee80 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
1ee90 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
1eea0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
1eeb0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1eec0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
1eed0 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
1eee0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
1eef0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
1ef00 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
1ef10 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
1ef20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
1ef30 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
1ef40 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
1ef50 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
1ef60 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
1ef70 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
1ef80 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
1ef90 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
1efa0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
1efb0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
1efc0 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
1efd0 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
1efe0 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
1eff0 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
1f000 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
1f010 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
1f020 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
1f030 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
1f040 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
1f050 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
1f060 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
1f070 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
1f080 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
1f090 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
1f0a0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
1f0b0 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
1f0c0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
1f0d0 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
1f0e0 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
1f0f0 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
1f100 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
1f110 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
1f120 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
1f130 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
1f140 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
1f150 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
1f160 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53  Cost = nRow + rS
1f170 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a  cale + 16;..  /*
1f180 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67   Multiple by log
1f190 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73 20 74  (M) where M is t
1f1a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1f1b0 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55  put rows..  ** U
1f1c0 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72  se the LIMIT for
1f1d0 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c   M if it is smal
1f1e0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57  ler */.  if( (pW
1f1f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1f200 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d   & WHERE_USE_LIM
1f210 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f  IT)!=0 && pWInfo
1f220 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b  ->iLimit<nRow ){
1f230 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e  .    nRow = pWIn
1f240 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  fo->iLimit;.  }.
1f250 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65    rSortCost += e
1f260 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72  stLog(nRow);.  r
1f270 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b  eturn rSortCost;
1f280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1f290 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
1f2a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
1f2b0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
1f2c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1f2d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
1f2e0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
1f2f0 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
1f300 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
1f310 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
1f320 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
1f330 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
1f340 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
1f350 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
1f360 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
1f370 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
1f380 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
1f390 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
1f3a0 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
1f3b0 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
1f3c0 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
1f3d0 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
1f3e0 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
1f3f0 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
1f400 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
1f410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1f420 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
1f430 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
1f440 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
1f450 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
1f460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f470 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
1f480 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f490 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74  , LogEst nRowEst
1f4a0 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
1f4b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1f4c0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
1f4d0 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
1f4e0 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
1f4f0 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f510 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1f520 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
1f530 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1f540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f550 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1f560 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f580 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1f590 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
1f5a0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
1f5b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f5c0 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
1f5d0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
1f5e0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
1f5f0 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
1f600 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1f610 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20  rs */.  int mxI 
1f620 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f630 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1f640 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c  xt entry to repl
1f650 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ace */.  int nOr
1f660 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
1f670 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f680 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1f690 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  terms */.  LogEs
1f6a0 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
1f6b0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1f6c0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
1f6d0 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
1f6e0 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20  st mxUnsorted = 
1f6f0 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  0;    /* Maximum
1f700 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   unsorted cost o
1f710 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20  f a set of path 
1f720 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
1f730 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
1f740 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
1f750 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
1f760 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
1f770 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
1f780 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
1f790 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
1f7a0 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
1f7b0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
1f7c0 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
1f7d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
1f7e0 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
1f7f0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
1f800 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1f810 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
1f820 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
1f830 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
1f840 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f850 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1f860 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
1f870 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
1f880 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
1f890 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
1f8a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
1f8b0 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
1f8c0 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
1f8d0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
1f8e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
1f8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f900 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
1f910 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
1f920 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f  */.  LogEst *aSo
1f930 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f  rtCost = 0;    /
1f940 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61  * Sorting and pa
1f950 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f  rtial sorting co
1f960 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  sts */.  char *p
1f970 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
1f980 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1f990 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
1f9a0 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
1f9b0 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
1f9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1f9d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1f9e0 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65  ocated at pSpace
1f9f0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1fa00 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1fa10 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1fa20 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
1fa30 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
1fa40 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
1fa50 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
1fa60 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
1fa70 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
1fa80 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
1fa90 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
1faa0 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
1fab0 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
1fac0 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
1fad0 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
1fae0 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
1faf0 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
1fb00 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28  Loop<=1) ? 1 : (
1fb10 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
1fb20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
1fb30 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
1fb40 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
1fb50 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
1fb60 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
1fb70 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73  solver.  (nRowEs
1fb80 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73  t=%d)\n", nRowEs
1fb90 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52  t));..  /* If nR
1fba0 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e  owEst is zero an
1fbb0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  d there is an OR
1fbc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
1fbd0 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69  gnore it. In thi
1fbe0 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  s.  ** case the 
1fbf0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
1fc00 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d  call is to estim
1fc10 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
1fc20 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a  f rows returned.
1fc30 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72    ** by the over
1fc40 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20  all query. Once 
1fc50 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61  this estimate ha
1fc60 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  s been obtained,
1fc70 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
1fc80 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
1fc90 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63  s function a sec
1fca0 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e  ond time, passin
1fcb0 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61  g the estimate a
1fcc0 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45  s the.  ** nRowE
1fcd0 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a  st parameter.  *
1fce0 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
1fcf0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
1fd00 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
1fd10 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
1fd20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64   }else{.    nOrd
1fd30 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  erBy = pWInfo->p
1fd40 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
1fd50 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
1fd60 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1fd70 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c  e space for aTo,
1fd80 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74   aFrom and aSort
1fd90 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61  Cost[] */.  nSpa
1fda0 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ce = (sizeof(Whe
1fdb0 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
1fdc0 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
1fdd0 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
1fde0 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66  nSpace += sizeof
1fdf0 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
1fe00 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  rBy;.  pSpace = 
1fe10 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1fe20 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29  awNN(db, nSpace)
1fe30 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
1fe40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1fe50 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1fe60 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
1fe70 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
1fe80 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
1fe90 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
1fea0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
1feb0 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
1fec0 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
1fed0 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
1fee0 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
1fef0 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
1ff00 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
1ff10 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
1ff20 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
1ff30 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66  p = pX;.  }.  if
1ff40 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( nOrderBy ){.  
1ff50 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1ff60 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ff70 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  use and it is no
1ff80 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c  t being ignored,
1ff90 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73   set up.    ** s
1ffa0 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f  pace for the aSo
1ffb0 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20  rtCost[] array. 
1ffc0 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Each element of 
1ffd0 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72  the aSortCost ar
1ffe0 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69  ray.    ** is ei
1fff0 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e  ther zero - mean
20000 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79  ing it has not y
20010 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  et been initiali
20020 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20  zed - or the.   
20030 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74   ** cost of sort
20040 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73  ing nRowEst rows
20050 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20 74   of data where t
20060 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d 73  he first X terms
20070 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f   of.    ** the O
20080 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
20090 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72  re already in or
200a0 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73 20  der, where X is 
200b0 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a  the array .    *
200c0 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20  * index.  */.   
200d0 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f   aSortCost = (Lo
200e0 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65  gEst*)pX;.    me
200f0 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20  mset(aSortCost, 
20100 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  0, sizeof(LogEst
20110 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20  ) * nOrderBy);. 
20120 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f   }.  assert( aSo
20130 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53  rtCost==0 || &pS
20140 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
20150 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b  har*)&aSortCost[
20160 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61  nOrderBy] );.  a
20170 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74  ssert( aSortCost
20180 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e  !=0 || &pSpace[n
20190 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70  Space]==(char*)p
201a0 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20  X );..  /* Seed 
201b0 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
201c0 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
201d0 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
201e0 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
201f0 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
20200 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
20210 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
20220 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38  ions go above 28
20230 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
20240 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
20250 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
20260 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
20270 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
20280 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f  first 28.  ** ro
20290 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
202a0 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
202b0 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
202c0 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
202d0 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
202e0 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65  Loop, 48);  asse
202f0 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c  rt( 48==sqlite3L
20300 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e  ogEst(28) );.  n
20310 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65  From = 1;.  asse
20320 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f  rt( aFrom[0].isO
20330 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69  rdered==0 );.  i
20340 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
20350 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69     /* If nLoop i
20360 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
20370 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74  re are no FROM t
20380 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72  erms in the quer
20390 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  y. Since.    ** 
203a0 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
203b0 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75 72   query may retur
203c0 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f  n a maximum of o
203d0 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75  ne row, the resu
203e0 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61  lts.    ** are a
203f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 65  lready in the re
20400 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53  quested order. S
20410 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20  et isOrdered to 
20420 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20  nOrderBy to.    
20430 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73  ** indicate this
20440 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69  . Or, if nLoop i
20450 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
20460 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72  ero, set isOrder
20470 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c  ed to.    ** -1,
20480 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
20490 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
204a0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
204b0 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20  e ordered, .    
204c0 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
204d0 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  the loops added 
204e0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
204f0 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72  lan.  */.    aFr
20500 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20  om[0].isOrdered 
20510 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a  = nLoop>0 ? -1 :
20520 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a   nOrderBy;.  }..
20530 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
20540 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
20550 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
20560 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
20570 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
20580 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
20590 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
205a0 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
205b0 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
205c0 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
205d0 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
205e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
205f0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
20600 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
20610 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
20620 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
20630 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
20640 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
20650 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
20660 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
20670 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
20680 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
20690 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f  oop){.        Lo
206a0 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20  gEst nOut;      
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64 20  /* Rows visited 
206d0 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  by (pFrom+pWLoop
206e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67  ) */.        Log
206f0 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  Est rCost;      
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20710 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28  * Cost of path (
20720 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20730 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
20740 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20  rUnsorted;      
20750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
20760 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28  sorted cost of (
20770 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20780 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72  .        i8 isOr
20790 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
207a0 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73  sOrdered;  /* is
207b0 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46 72  Ordered for (pFr
207c0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
207d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61        Bitmask ma
207e0 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  skNew;          
207f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
20800 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20 62  of src visited b
20810 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20  y (..) */.      
20820 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
20830 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
20840 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72      /* Mask of r
20850 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66  ev-order loops f
20860 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20  or (..) */..    
20870 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
20880 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
20890 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
208a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
208b0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
208c0 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
208d0 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
208e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
208f0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
20900 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20910 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
20920 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30  & pFrom->nRow<10
20930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
20940 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20 61   Do not use an a
20950 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
20960 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70 20  f the this loop 
20970 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20 20  is expected.    
20980 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20        ** to run 
20990 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69 6d 65  less than 2 time
209a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
209b0 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
209c0 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
209d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
209e0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
209f0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
20a00 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
20a10 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
20a20 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
20a30 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
20a40 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
20a50 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
20a60 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
20a70 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
20a80 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
20a90 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
20aa0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
20ab0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
20ac0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20ad0 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
20ae0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
20af0 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
20b00 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
20b10 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
20b20 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
20b30 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
20b40 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
20b50 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
20b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
20b70 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
20b80 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
20b90 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
20bc0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
20bd0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
20c00 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
20c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20c20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
20c30 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
20c40 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
20c50 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
20c60 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
20c70 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
20c80 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
20c90 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20ca0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
20cb0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
20cc0 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
20cd0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
20cf0 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
20d00 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
20d10 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
20d20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20d30 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
20d40 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
20d50 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
20d60 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
20d70 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
20d80 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
20da0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
20db0 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
20dc0 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
20dd0 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
20de0 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
20df0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
20e00 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
20e10 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20e30 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
20e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
20e50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
20e60 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
20e70 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20e80 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
20e90 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
20ea0 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
20eb0 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
20ec0 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
20ed0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
20ee0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
20ef0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
20f00 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
20f10 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
20f20 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
20f30 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
20f40 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
20f50 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
20f60 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
20f70 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
20f80 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
20f90 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
20fa0 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
20fb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
20fc0 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
20fd0 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
20fe0 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
20ff0 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
21000 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
21010 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  >isOrdered==(-1)
21020 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28  )==(isOrdered==(
21030 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61  -1))" for the ra
21040 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  nge.        ** o
21050 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66  f legal values f
21060 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31  or isOrdered, -1
21070 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ..64..        */
21080 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
21090 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
210a0 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
210b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
210c0 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
210d0 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
210e0 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72    && ((pTo->isOr
210f0 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
21100 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20  &0x80)==0.      
21110 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21120 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
21130 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
21140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21160 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
21170 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
21180 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
21190 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74  he existing best
211a0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61  -so-far paths ma
211b0 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  tch the candidat
211c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
211d0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
211e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  e.           && 
211f0 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  (rCost>mxCost ||
21200 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20   (rCost==mxCost 
21210 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78  && rUnsorted>=mx
21220 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20  Unsorted)).     
21230 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21240 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
21250 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20  nt candidate is 
21260 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61  no better than a
21270 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ny of the mxChoi
21280 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ce.            *
21290 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c  * paths currentl
212a0 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f  y in the best-so
212b0 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f  -far buffer.  So
212c0 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20   discard.       
212d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e       ** this can
212e0 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69  didate as not vi
212f0 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
21300 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
21310 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
21320 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
21330 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
21340 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
21350 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21360 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
21370 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21380 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
213a0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
213b0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
213c0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
213d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
213e0 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
213f0 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
21400 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
21410 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21420 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21430 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
21440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
21450 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
21460 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nts it means tha
21470 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64  t the new candid
21480 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ate path.       
21490 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
214a0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
214b0 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61  et of best-so-fa
214c0 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20  r paths. */.    
214d0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
214e0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
214f0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
21500 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
21510 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
21520 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21530 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
21540 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
21560 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
21570 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
21580 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
21590 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
215a0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
215b0 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
215c0 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
215d0 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
215e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
215f0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
21600 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21610 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
21620 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
21630 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21640 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
21650 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
21660 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
21670 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
21680 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
21690 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
216a0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
216b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
216c0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
216d0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
216e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
216f0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
21700 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
21710 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
21720 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d  here if best-so-
21730 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f  far path pTo=aTo
21740 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a  [jj] covers the.
21750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
21760 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
21770 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69  nd has the sam i
21780 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67  sOrdered setting
21790 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
217a0 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70    ** candidate p
217b0 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ath.  Check to s
217c0 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  ee if the candid
217d0 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61  ate should repla
217e0 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
217f0 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61  pTo or if the ca
21800 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62  ndidate should b
21810 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20  e skipped */.   
21820 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
21830 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28  rCost<rCost || (
21840 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
21850 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
21860 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20  nOut) ){.#ifdef 
21870 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
21880 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
21890 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
218a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
218b0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
218c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
218d0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
218e0 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
218f0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
21900 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
21930 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
21940 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
21950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21960 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
21970 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
21980 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
219a0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
219b0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
219c0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
219f0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
21a00 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
21a10 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
21a20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
21a30 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
21a40 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
21a50 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
21a60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21a70 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63           /* Disc
21a80 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74  ard the candidat
21a90 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74  e path from furt
21aa0 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
21ab0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
21ac0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
21ad0 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
21af0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
21b00 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
21b10 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
21b20 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
21b30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
21b40 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
21b50 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
21b60 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74  path is better t
21b70 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  han the.        
21b80 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20    ** pTo path.  
21b90 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68  Replace pTo with
21ba0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
21bb0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
21bc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21bd0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
21be0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
21bf0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
21c00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21c10 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
21c30 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d  pdate %s cost=%-
21c40 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
21c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21c60 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
21c70 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
21c80 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
21c90 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
21ca0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
21cb0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
21cc0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21cd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21ce0 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
21cf0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21d00 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21d20 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
21d30 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
21d40 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
21d50 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
21d60 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
21d70 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
21d80 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
21d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
21da0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
21db0 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
21dc0 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
21dd0 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
21de0 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
21df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
21e00 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
21e10 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
21e20 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
21e30 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
21e40 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
21e50 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
21e60 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
21e70 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
21e80 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
21e90 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72  o->rUnsorted = r
21ea0 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
21eb0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21ec0 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
21ed0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
21ee0 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
21ef0 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
21f00 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
21f10 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
21f20 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
21f30 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
21f40 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
21f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
21f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21f70 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
21f80 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
21f90 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54   mxUnsorted = aT
21fa0 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
21fb0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
21fc0 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
21fd0 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
21fe0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
21ff0 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
22000 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20  t>mxCost .      
22010 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e         || (pTo->
22020 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
22030 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e   pTo->rUnsorted>
22040 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20  mxUnsorted) .   
22050 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
22060 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
22070 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55               mxU
22090 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72  nsorted = pTo->r
220a0 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
220b0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
220c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
220d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
220e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
220f0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
22100 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
22110 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
22120 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
22130 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20  ace & 0x02 ){.  
22140 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22150 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
22160 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
22170 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
22180 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
22190 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
221a0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
221b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
221c0 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
221d0 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
221e0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
221f0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
22200 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
22210 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
22220 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
22230 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
22240 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f  rdered>=0 ? (pTo
22250 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29  ->isOrdered+'0')
22260 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
22270 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
22280 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  red>0 ){.       
22290 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
222a0 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
222b0 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
222c0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
222d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
222e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
222f0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
22300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
22310 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
22320 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
22330 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
22340 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
22350 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
22360 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
22370 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
22380 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
22390 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
223a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
223b0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
223c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
223d0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
223e0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
223f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22400 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
22410 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
22420 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
22430 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
22440 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
22450 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
22460 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
22470 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
22480 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
22490 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
224a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
224b0 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
224c0 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
224d0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
224e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
224f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
22500 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
22510 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
22520 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
22530 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
22540 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
22550 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
22560 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
22570 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
22580 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
22590 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
225a0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
225b0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
225c0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
225d0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
225e0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
225f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
22600 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
22610 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
22620 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
22630 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22640 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
22650 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
22660 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22670 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
22680 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
22690 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
226a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
226b0 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
226c0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
226d0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
226e0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
226f0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
22700 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
22710 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
22720 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
22730 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
22740 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
22750 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
22760 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
22770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
22780 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
22790 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
227a0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
227b0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
227c0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
227d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
227e0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
227f0 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
22800 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22810 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
22820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
22830 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
22840 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
22850 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
22860 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
22870 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
22880 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
22890 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
228a0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
228b0 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
228c0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
228d0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
228e0 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  at<0 ) pWInfo->n
228f0 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
22900 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
22910 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
22920 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
22930 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
22940 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
22950 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20  TBYGROUP).      
22960 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42    && pWInfo->nOB
22970 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  Sat==pWInfo->pOr
22980 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20  derBy->nExpr && 
22990 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20  nLoop>0.    ){. 
229a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
229b0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
229c0 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
229d0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
229e0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
229f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
22a00 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
22a10 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
22a20 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
22a30 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20  p-1], &revMask. 
22a40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
22a50 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
22a60 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
22a70 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49   if( nOrder==pWI
22a80 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
22a90 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22aa0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
22ab0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   1;.        pWIn
22ac0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65  fo->revMask = re
22ad0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  vMask;.      }. 
22ae0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
22af0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
22b00 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
22b10 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
22b20 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
22b30 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
22b40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22b50 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
22b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22b70 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
22b80 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
22b90 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
22ba0 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
22bb0 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
22bc0 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
22bd0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
22be0 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
22bf0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
22c00 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
22c10 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
22c20 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
22c30 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
22c40 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
22c50 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
22c60 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
22c70 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
22c80 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
22c90 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
22ca0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
22cb0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
22cc0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
22cd0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
22ce0 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
22cf0 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
22d00 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
22d10 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
22d20 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
22d30 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
22d40 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
22d50 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
22d60 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
22d70 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
22d80 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
22d90 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
22da0 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
22db0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22dc0 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
22dd0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
22de0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
22df0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
22e00 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
22e10 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
22e20 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
22e30 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
22e40 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
22e50 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
22e60 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22e70 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
22e80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
22e90 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
22ea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
22eb0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
22ec0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
22ed0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
22ee0 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
22ef0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
22f00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22f10 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
22f20 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20  exedBy ) return 
22f30 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
22f40 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
22f50 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
22f60 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
22f70 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
22f80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
22f90 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
22fa0 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
22fb0 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
22fc0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
22fd0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
22fe0 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IS, 0);.  if( pT
22ff0 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63  erm ){.    testc
23000 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
23010 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
23020 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
23030 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
23040 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
23050 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
23060 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
23070 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
23080 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
23090 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
230a0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
230b0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
230c0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
230d0 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
230e0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
230f0 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
23100 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
23110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
23120 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
23130 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
23140 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
23150 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a      int opMask;.
23160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
23170 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
23180 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
23190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  );.      if( !Is
231a0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
231b0 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  ).       || pIdx
231c0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
231d0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
231e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
231f0 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
23200 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
23210 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23220 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78     opMask = pIdx
23230 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
23240 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20  (WO_EQ|WO_IS) : 
23250 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72  WO_EQ;.      for
23260 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
23270 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
23280 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
23290 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
232a0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
232b0 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29  0, opMask, pIdx)
232c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
232d0 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
232e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
232f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
23300 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
23310 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
23320 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
23330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23340 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
23350 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
23360 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
23370 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
23380 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
23390 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
233a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
233b0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
233c0 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
233d0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
233e0 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
233f0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
23400 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
23410 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
23420 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
23430 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
23440 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
23450 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
23460 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
23470 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
23480 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
23490 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
234a0 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
234b0 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
234c0 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
234d0 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
234e0 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
234f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
23500 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
23510 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
23520 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
23530 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
23540 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
23550 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
23560 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
23570 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
23580 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
23590 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
235a0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
235b0 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
235c0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
235d0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
235e0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
235f0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
23600 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
23610 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
23620 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
23630 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
23640 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
23650 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
23660 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
23670 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
23680 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
23690 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
236a0 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
236b0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
236c0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
236d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
236e0 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
236f0 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
23700 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
23710 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
23720 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
23730 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
23740 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
23750 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
23760 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
23770 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
23780 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
23790 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
237a0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
237b0 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
237c0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
237d0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
237e0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
237f0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
23800 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
23810 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
23820 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
23830 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
23840 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
23850 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
23860 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
23870 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
23880 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
23890 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
238a0 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
238b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
238c0 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
238d0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
238e0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
238f0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
23900 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
23910 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
23920 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23930 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
23940 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
23950 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
23960 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
23970 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
23980 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
23990 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
239a0 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
239b0 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
239c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
239d0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
239e0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
239f0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
23a00 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
23a10 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
23a20 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
23a30 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
23a40 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
23a50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
23a60 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
23a70 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
23a80 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
23ab0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
23ac0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
23ae0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
23af0 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
23b00 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
23b10 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
23b20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
23b30 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
23b40 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
23b50 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
23b60 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
23b70 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23b80 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
23b90 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
23ba0 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
23bb0 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
23bc0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
23bd0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
23be0 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
23bf0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
23c00 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
23c10 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
23c20 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
23c30 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
23c40 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
23c50 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
23c60 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
23c70 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
23c80 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
23c90 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
23ca0 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
23cb0 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
23cc0 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
23cd0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
23ce0 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
23cf0 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
23d00 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
23d10 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
23d20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
23d30 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
23d40 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
23d50 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
23d60 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
23d70 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
23d80 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
23d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
23da0 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
23db0 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
23dc0 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
23dd0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
23de0 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
23df0 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
23e00 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
23e10 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
23e20 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
23e30 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
23e40 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
23e50 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
23e60 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
23e70 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
23e80 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
23e90 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
23ea0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23eb0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
23ec0 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
23ed0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
23ee0 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
23ef0 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
23f00 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
23f10 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
23f20 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
23f30 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
23f40 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
23f50 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
23f60 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
23f70 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
23f80 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
23f90 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
23fa0 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
23fb0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
23fc0 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
23fd0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
23fe0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
23ff0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
24000 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
24010 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
24020 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
24030 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
24040 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
24050 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
24060 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
24070 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
24080 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
24090 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
240a0 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
240b0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
240c0 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
240d0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
240e0 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
240f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
24100 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
24110 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
24120 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
24130 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
24140 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
24150 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
24160 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
24170 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
24180 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
24190 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
241a0 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
241b0 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
241c0 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
241d0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
241e0 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
241f0 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
24200 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
24210 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
24220 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
24230 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
24240 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
24250 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
24260 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
24270 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
24280 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
24290 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
242a0 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
242b0 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
242c0 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
242d0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
242e0 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
242f0 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
24300 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
24310 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
24320 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
24330 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
24340 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
24350 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
24360 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
24370 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
24380 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
24390 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
243a0 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
243b0 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
243c0 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
243d0 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
243e0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
243f0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
24400 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
24410 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
24420 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
24430 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
24440 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
24450 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
24460 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
24470 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
24480 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
24490 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
244a0 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
244b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
244c0 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
244d0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
244e0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
244f0 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
24500 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
24510 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
24520 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
24530 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
24540 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
24550 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
24560 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
24570 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
24580 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
24590 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
245a0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
245b0 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
245c0 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
245d0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
245e0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
245f0 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
24600 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
24610 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
24620 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
24630 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
24640 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24650 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
24660 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
24670 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
24680 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
24690 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
246a0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
246b0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
246c0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
246d0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
246e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
246f0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
24700 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
24710 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
24720 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
24730 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
24740 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
24750 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
24760 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
24770 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
24780 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
24790 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
247a0 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
247b0 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75  t.h */.  int iAu
247c0 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20 2f  xArg           /
247d0 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
247e0 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
247f0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
24800 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  mber,.          
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24820 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49   If WHERE_USE_LI
24830 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69  MIT, then the li
24840 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b  mit amount */.){
24850 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
24860 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
24870 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
24880 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
24890 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
248a0 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
248b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
248c0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
248d0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
248e0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
248f0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
24900 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
24910 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
24920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
24930 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
24940 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
24950 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
24960 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
24970 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
24980 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
24990 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
249a0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
249b0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
249c0 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
249d0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
249e0 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
249f0 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
24a00 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
24a10 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
24a20 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
24a30 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
24a40 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
24a50 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
24a60 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
24a70 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
24a80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24a90 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
24aa0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24ae0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24af0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24b00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
24b10 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
24b20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24b30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24b40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62  n code */.  u8 b
24b50 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20  Fordelete = 0;  
24b60 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47         /* OPFLAG
24b70 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65  _FORDELETE or ze
24b80 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  ro, as appropria
24b90 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  te */..  assert(
24ba0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
24bb0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
24bc0 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20  TIROW)==0 || (. 
24bd0 20 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61         (wctrlFla
24be0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
24bf0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
24c00 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
24c10 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
24c20 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
24c30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
24c40 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
24c50 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 6f 72 20  NETABLE_ONLY or 
24c60 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
24c70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
24c80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24c90 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d  _ONETABLE_ONLY)=
24ca0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
24cb0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
24cc0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
24cd0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ==0 );..  /* Var
24ce0 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
24cf0 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
24d00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
24d10 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
24d20 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
24d30 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
24d40 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
24d50 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
24d60 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
24d70 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
24d80 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
24d90 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
24da0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
24db0 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
24dc0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
24dd0 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
24de0 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
24df0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
24e00 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
24e10 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
24e20 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
24e30 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
24e40 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
24e50 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
24e60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
24e70 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
24e80 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
24e90 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
24ea0 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
24eb0 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
24ec0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
24ed0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
24ee0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
24ef0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
24f00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
24f10 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
24f20 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
24f30 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
24f40 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
24f50 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
24f60 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
24f70 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
24f80 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
24f90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24fa0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
24fb0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
24fc0 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
24fd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
24fe0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
24ff0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
25000 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
25010 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
25020 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
25030 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
25040 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
25050 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
25060 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
25070 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
25080 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
25090 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
250a0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
250b0 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
250c0 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
250d0 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
250e0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
250f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
25100 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
25110 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
25120 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
25130 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
25140 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
25150 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
25160 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
25170 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
25180 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
25190 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
251a0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
251b0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
251c0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
251d0 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
251e0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
251f0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
25200 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
25210 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
25220 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
25230 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
25240 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
25250 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
25260 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
25270 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
25280 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
25290 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
252a0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
252b0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
252c0 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
252d0 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
252e0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
252f0 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
25300 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
25310 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
25320 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
25330 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
25340 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
25350 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
25360 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
25370 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
25380 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
253a0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
253b0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
253c0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
253d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
253e0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
253f0 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
25400 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
25410 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
25420 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
25430 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
25440 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
25450 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
25460 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
25470 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
25480 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
25490 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
254a0 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
254b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
254c0 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
254d0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
254e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
254f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
25500 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
25510 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ags;.  pWInfo->i
25520 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b  Limit = iAuxArg;
25530 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
25540 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
25550 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
25560 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
25570 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
25580 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
25590 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
255a0 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
255b0 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
255c0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
255d0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
255e0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
255f0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
25600 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
25610 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
25620 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
25630 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
25640 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
25650 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
25660 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
25670 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
25680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25690 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
256a0 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
256b0 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
256c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
256d0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
256e0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
256f0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
25700 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
25710 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
25720 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
25730 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
25740 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
25750 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
25760 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
25770 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
25780 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
25790 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
257a0 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
257b0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
257c0 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
257d0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
257e0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
257f0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
25800 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
25810 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
25820 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
25830 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  thru..  */.  for
25840 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
25850 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
25860 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69  {.    if( nTabLi
25870 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
25880 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
25890 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e  tJoin(sWLB.pWC->
258a0 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
258b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
258c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
258d0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
258e0 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e  .pExpr, pWInfo->
258f0 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20  iBreak,.        
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25910 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
25920 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e  LL);.      sWLB.
25930 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61  pWC->a[ii].wtFla
25940 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
25950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25960 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
25970 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
25980 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
25990 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
259a0 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
259b0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
259c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
259d0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
259e0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
259f0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
25a00 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
25a10 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
25a20 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
25a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
25a40 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
25a50 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
25a60 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
25a70 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
25a80 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65    ** The N-th te
25a90 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
25aa0 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65  lause is assigne
25ab0 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31  d a bitmask of 1
25ac0 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <<N..  **.  ** T
25ad0 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
25ae0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
25af0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
25b00 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
25b10 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62  k for.  ** a tab
25b20 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
25b30 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
25b40 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
25b50 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
25b60 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e  f T..  ** Knowin
25b70 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
25b80 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
25b90 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
25ba0 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20  ft join is.  ** 
25bb0 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
25bc0 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
25bd0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
25be0 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
25bf0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
25c00 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
25c10 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
25c20 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
25c30 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
25c40 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
25c50 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
25c60 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
25c70 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
25c80 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
25c90 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
25ca0 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
25cb0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
25cc0 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
25cd0 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
25ce0 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
25cf0 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
25d00 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
25d10 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
25d20 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
25d30 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61  eTabFuncArgs(pPa
25d40 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e  rse, &pTabList->
25d50 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e  a[ii], &pWInfo->
25d60 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  sWC);.  }.#ifdef
25d70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
25d80 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
25d90 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
25da0 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
25db0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
25dc0 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
25dd0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
25de0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
25df0 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42  assert( m==MASKB
25e00 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65  IT(ii) );.  }.#e
25e10 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
25e20 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
25e30 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
25e40 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
25e50 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
25e60 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
25e70 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
25e80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25e90 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25ea0 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46  r;..  if( wctrlF
25eb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
25ec0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
25ed0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
25ee0 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
25ef0 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
25f00 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
25f10 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
25f20 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
25f30 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
25f40 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
25f50 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
25f60 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
25f70 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
25f80 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
25f90 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
25fa0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
25fb0 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
25fc0 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
25fd0 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
25fe0 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
25ff0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
26000 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
26010 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
26020 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
26030 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
26040 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
26050 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
26060 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
26070 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ts */.#if define
26080 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
26090 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69  BLED).  if( sqli
260a0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
260b0 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71  0xffff ){.    sq
260c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
260d0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
260e0 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c  Start *** (wctrl
260f0 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74  Flags: 0x%x",wct
26100 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  rlFlags);.    if
26110 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
26120 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29  HERE_USE_LIMIT )
26130 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26140 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69  ebugPrintf(", li
26150 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72  mit: %d", iAuxAr
26160 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
26170 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26180 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  (")\n");.  }.  i
26190 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
261a0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20  race & 0x100 ){ 
261b0 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74  /* Display all t
261c0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
261d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
261e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
261f0 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  =0; i<sWLB.pWC->
26200 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
26210 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
26220 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  t(&sWLB.pWC->a[i
26230 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], i);.    }.  }
26240 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
26250 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
26260 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
26270 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
26280 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
26290 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
262a0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
262b0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
262c0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
262d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
262e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
262f0 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73  ace ){    /* Dis
26300 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
26310 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
26320 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
26330 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
26340 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
26350 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c  ic const char zL
26360 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
26370 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
26380 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
263c0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
263d0 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
263e0 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
263f0 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
26400 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
26410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
26420 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
26430 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
26440 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26450 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70  pPrint(p, sWLB.p
26460 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WC);.      }.   
26470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
26480 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
26490 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
264a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
264b0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
264c0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
264d0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
264e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
264f0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
26500 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
26510 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
26520 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
26530 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
26540 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
26550 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
26560 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26570 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
26580 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
26590 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
265a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
265b0 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
265c0 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
265d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
265e0 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
265f0 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
26600 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
26610 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
26620 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26630 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
26640 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
26650 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26660 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
26670 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
26680 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
26690 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
266a0 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20  nOBSat>0 ){.    
266b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
266c0 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25  intf(" ORDERBY=%
266d0 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  d,0x%llx", pWInf
266e0 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66  o->nOBSat, pWInf
266f0 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
26700 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
26710 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
26720 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
26730 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
26740 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
26750 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26760 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
26770 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
26780 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26790 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
267a0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
267b0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
267c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
267d0 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
267e0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
267f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26800 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
26810 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
26820 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
26830 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26840 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
26850 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
26860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26870 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26880 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
26890 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
268a0 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
268b0 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
268c0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
268d0 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
268e0 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29  WLoop, sWLB.pWC)
268f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
26900 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
26910 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
26920 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
26930 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
26940 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
26950 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
26960 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
26970 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
26980 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
26990 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
269a0 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
269b0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
269c0 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57  bUsed = sqlite3W
269d0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
269e0 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
269f0 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
26a00 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
26a10 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64 20  {.      tabUsed 
26a20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  |= sqlite3WhereE
26a30 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
26a40 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64  skSet, sWLB.pOrd
26a50 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  erBy);.    }.   
26a60 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
26a70 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20  nLevel>=2 ){.   
26a80 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
26a90 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  erm, *pEnd;.    
26aa0 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    pLoop = pWInfo
26ab0 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
26ac0 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  el-1].pWLoop;.  
26ad0 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
26ae0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
26af0 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69  op->iTab].fg.joi
26b00 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
26b10 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26b20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
26b30 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
26b40 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
26b50 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
26b60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26b70 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
26b80 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
26b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26ba0 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
26bb0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
26bc0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26bd0 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
26be0 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
26bf0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
26c00 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
26c10 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
26c20 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
26c30 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
26c40 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
26c50 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
26c60 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
26c70 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
26c80 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
26c90 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
26ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
26cb0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
26cc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
26cd0 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
26ce0 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
26cf0 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
26d00 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
26d10 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
26d20 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
26d30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
26d40 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
26d50 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
26d60 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
26d70 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
26d80 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
26d90 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
26da0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
26db0 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
26dc0 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
26dd0 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
26de0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
26df0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
26e00 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
26e10 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
26e20 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
26e30 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
26e40 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
26e50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26e60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26e70 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
26e80 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
26e90 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
26ea0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
26eb0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26ec0 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b  S_DESIRED)!=0 ){
26ed0 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
26ee0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e   = pWInfo->a[0].
26ef0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
26f00 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77  .    int bOnerow
26f10 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48   = (wsFlags & WH
26f20 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a  ERE_ONEROW)!=0;.
26f30 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a      if( bOnerow.
26f40 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46       || ((wctrlF
26f50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26f60 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d  PASS_MULTIROW)!=
26f70 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
26f80 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48  0==(wsFlags & WH
26f90 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
26fa0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
26fb0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
26fc0 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45   = bOnerow ? ONE
26fd0 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e  PASS_SINGLE : ON
26fe0 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20  EPASS_MULTI;.   
26ff0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
27000 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
27010 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73  Tab) && (wsFlags
27020 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
27030 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Y) ){.        if
27040 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
27050 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
27060 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  TIROW ){.       
27070 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20     bFordelete = 
27080 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
27090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
270a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
270b0 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
270c0 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57   = (wsFlags & ~W
270d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a  HERE_IDX_ONLY);.
270e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
270f0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
27100 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
27110 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
27120 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
27130 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
27140 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
27150 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
27160 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
27170 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
27180 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
27190 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
271a0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
271b0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
271c0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
271d0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
271e0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
271f0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
27200 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
27210 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
27220 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
27230 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
27240 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
27250 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
27260 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
27270 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
27280 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
27290 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
272a0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
272b0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
272c0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
272d0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
272e0 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
272f0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
27300 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
27310 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
27320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
27330 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
27340 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
27350 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
27360 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
27370 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
27380 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
27390 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
273a0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
273b0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
273c0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
273d0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
273e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
273f0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
27400 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
27410 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
27420 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
27430 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
27440 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
27450 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
27460 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
27470 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
27480 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
27490 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
274a0 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
274b0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
274c0 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
274d0 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
274e0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
274f0 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
27500 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  OFF ){.        o
27510 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
27520 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
27530 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
27540 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ] = pTabItem->iC
27550 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a  ursor;.      };.
27560 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
27570 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
27580 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
27590 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
275a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
275b0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
275c0 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  r==pLevel->iTabC
275d0 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
275e0 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
275f0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
27600 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
27610 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
27620 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
27630 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
27640 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
27650 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
27660 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
27670 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
27680 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
27690 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
276a0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
276b0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
276c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
276d0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
276e0 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
276f0 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
27700 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
27710 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27720 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49  geP4(v, -1, SQLI
27730 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
27740 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
27750 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
27760 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
27770 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
27780 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
27790 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66  R_HINTS.      if
277a0 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
277b0 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
277c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
277d0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
277e0 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64  LAG_SEEKEQ|bFord
277f0 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  elete);.      }e
27800 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
27810 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
27820 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27830 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  , bFordelete);. 
27840 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
27850 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
27860 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
27870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27880 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
27890 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62  olumnsUsed, pTab
278a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
278b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278d0 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61   (const u8*)&pTa
278e0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20  bItem->colUsed, 
278f0 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
27900 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
27910 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
27920 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
27930 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
27940 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
27950 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
27960 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27970 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
27980 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
27990 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
279a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
279b0 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
279c0 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
279d0 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
279e0 2a 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77  * iAuxArg is alw
279f0 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20  ays set if to a 
27a00 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
27a10 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
27a20 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
27a30 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21 3d  ssert( iAuxArg!=
27a40 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
27a50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27a60 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
27a70 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
27a80 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
27a90 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
27aa0 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20  yIndex(pIx).    
27ab0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
27ac0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
27ad0 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20  LE_ONLY)!=0.    
27ae0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
27af0 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
27b00 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
27b10 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
27b20 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
27b30 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
27b40 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
27b50 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
27b60 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
27b70 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
27b80 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
27b90 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
27ba0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
27bb0 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
27bc0 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
27bd0 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
27be0 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
27bf0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
27c00 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
27c10 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
27c20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27c30 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
27c40 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
27c50 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
27c60 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
27c70 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
27c80 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
27c90 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
27ca0 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
27cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27cc0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
27cd0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
27ce0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
27cf0 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
27d00 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
27d10 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77  f( iAuxArg && (w
27d20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27d30 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
27d40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
27d50 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41  IndexCur = iAuxA
27d60 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rg;.        if( 
27d70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27d80 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20  RE_REOPEN_IDX ) 
27d90 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
27da0 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
27db0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
27dc0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
27dd0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
27de0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
27df0 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
27e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
27e10 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
27e20 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
27e30 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
27e40 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
27e50 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
27e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27e70 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
27e80 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
27e90 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
27ea0 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
27eb0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
27ec0 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
27ed0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
27ee0 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
27ef0 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
27f00 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
27f10 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
27f20 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
27f30 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
27f40 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
27f50 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
27f60 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
27f70 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
27f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27f90 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27fa0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
27fb0 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
27fc0 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
27fd0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
27fe0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
27ff0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
28000 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28010 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
28020 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
28030 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
28040 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28050 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
28060 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
28070 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
28080 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
28090 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
280a0 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
280b0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
280c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
280d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
280e0 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
280f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
28100 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
28110 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
28120 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
28130 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
28140 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
28150 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
28160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28180 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
28190 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
281a0 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
281b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281d0 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
281e0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
281f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
28200 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
28210 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
28220 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
28230 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
28240 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
28250 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
28260 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
28270 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
28280 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
28290 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
282a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
282b0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
282c0 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
282d0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
282e0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
282f0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
28300 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
28310 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
28320 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
28330 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
28340 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
28350 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
28360 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
28370 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
28380 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
28390 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
283a0 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
283b0 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
283c0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
283d0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
283e0 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
283f0 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
28400 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
28410 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
28420 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
28430 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
28440 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28450 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
28460 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
28470 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
28480 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
28490 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
284a0 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
284b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
284c0 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
284d0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
284e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
284f0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
28500 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
28510 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
28520 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
28530 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
28540 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
28550 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
28560 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
28570 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
28580 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
28590 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
285a0 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
285b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
285c0 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
285d0 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
285e0 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
285f0 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
28600 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
28610 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
28620 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
28630 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
28640 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
28650 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
28660 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
28670 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
28680 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53  sqlite3WhereAddS
28690 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61  canStatus(v, pTa
286a0 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61  bList, pLevel, a
286b0 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  ddrExplain);.   
286c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e   }.  }..  /* Don
286d0 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  e. */.  VdbeModu
286e0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
286f0 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22  egin WHERE-core"
28700 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  ));.  return pWI
28710 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
28720 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
28730 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
28740 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
28750 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
28760 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
28770 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
28780 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
28790 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
287a0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
287b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
287c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
287d0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
287e0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
287f0 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
28800 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
28810 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
28820 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
28830 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
28840 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
28850 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
28860 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
28870 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
28880 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28890 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
288a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
288b0 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
288c0 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
288d0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
288e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
288f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
28900 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
28910 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
28920 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
28930 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ..  */.  VdbeMod
28940 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
28950 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29  End WHERE-core")
28960 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
28970 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
28980 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
28990 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
289a0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
289b0 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76  t addr;.    pLev
289c0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
289d0 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
289e0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
289f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28a00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
28a10 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
28a20 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
28a30 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
28a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28a50 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76  beAddOp3(v, pLev
28a60 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
28a70 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20  p1, pLevel->p2, 
28a80 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20  pLevel->p3);.   
28a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28aa0 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
28ab0 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62  ->p5);.      Vdb
28ac0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28ad0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28ae0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
28af0 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
28b00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28b10 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
28b20 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20  OP_Prev);.      
28b30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28b40 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
28b50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  _VNext);.    }. 
28b60 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
28b70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28b80 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
28b90 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
28ba0 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
28bb0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
28bc0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
28bd0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28be0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
28bf0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
28c00 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
28c10 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
28c20 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
28c30 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
28c40 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
28c50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28c60 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28c70 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
28c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28c90 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
28ca0 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
28cb0 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
28cc0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
28cd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28ce0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28cf0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
28d00 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76  dLoopOp==OP_Prev
28d10 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
28d20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28d30 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
28d40 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65  Op==OP_NextIfOpe
28d50 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
28d60 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28d70 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
28d80 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
28d90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28da0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28db0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
28dc0 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
28dd0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b  vel->addrSkip ){
28de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28df0 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c  beGoto(v, pLevel
28e00 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
28e10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28e20 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63  v, "next skip-sc
28e30 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70  an on %s", pLoop
28e40 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
28e50 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
28e60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28e70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28e80 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
28e90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28ea0 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
28eb0 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20  addrSkip-2);.   
28ec0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
28ed0 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41  E_LIKE_DOESNT_MA
28ee0 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66  TCH_BLOBS.    if
28ef0 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69  ( pLevel->addrLi
28f00 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69  keRep ){.      i
28f10 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  nt op;.      if(
28f20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
28f30 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  p(v, pLevel->add
28f40 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20  rLikeRep-1)->p1 
28f50 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
28f60 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b  OP_DecrJumpZero;
28f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28f80 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75        op = OP_Ju
28f90 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20  mpZeroIncr;.    
28fa0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
28fb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
28fc0 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  p, pLevel->iLike
28fd0 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d  RepCntr, pLevel-
28fe0 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20  >addrLikeRep);. 
28ff0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29000 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  e(v);.    }.#end
29010 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  if.    if( pLeve
29020 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
29030 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
29040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29050 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
29060 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
29070 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
29080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
29090 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
290a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
290b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
290c0 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  | (pLoop->wsFlag
290d0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
290e0 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
290f0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
29100 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
29110 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
29120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29130 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
29140 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
29150 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
29160 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29170 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
29180 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
29190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
291a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
291b0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
291c0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
291d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
291e0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
291f0 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
29200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
29210 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
29220 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
29230 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
29240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
29260 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
29270 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
29280 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
29290 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
292a0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ddr);.    }.    
292b0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
292c0 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
292d0 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c  -loop%d: %s", i,
292e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
292f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54        pWInfo->pT
29300 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
29310 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a  ->iFrom].pTab->z
29320 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Name));.  }..  /
29330 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
29340 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
29350 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
29360 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
29370 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
29380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
29390 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
293a0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
293b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ;..  assert( pWI
293c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61  nfo->nLevel<=pTa
293d0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
293e0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
293f0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
29400 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
29410 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
29420 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20    int k, last;. 
29430 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
29440 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
29450 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
29460 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
29470 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
29480 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
29490 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
294a0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
294b0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
294c0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
294d0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
294e0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
294f0 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74  /* For a co-rout
29500 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20  ine, change all 
29510 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65  OP_Column refere
29520 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nces to the tabl
29530 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
29540 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20  co-routine into 
29550 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c  OP_Copy of resul
29560 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  t contained in a
29570 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a   register..    *
29580 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d  * OP_Rowid becom
29590 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20  es OP_Null..    
295a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49  */.    if( pTabI
295b0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
295c0 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  tine && !db->mal
295d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
295e0 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75     translateColu
295f0 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65 76  mnToCopy(v, pLev
29600 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c  el->addrBody, pL
29610 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29630 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 49             pTabI
29640 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20  tem->regResult, 
29650 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  0);.      contin
29660 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
29670 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
29680 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
29690 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
296a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
296b0 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
296c0 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75   do not close cu
296d0 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20  rsors that will 
296e0 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65  be reused by the
296f0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
29700 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f  .    ** (WHERE_O
29710 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e  MIT_OPEN_CLOSE).
29720 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
29730 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
29740 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
29750 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
29760 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
29770 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
29780 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
29790 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
297a0 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
297b0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
297c0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
297d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
297e0 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
297f0 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
29800 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
29810 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
29820 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
29830 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
29840 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73  EPASS_OFF && (ws
29850 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
29860 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
29870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29880 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
29890 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
298a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
298b0 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
298c0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
298d0 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57       && (ws & (W
298e0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41  HERE_IPK|WHERE_A
298f0 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a  UTO_INDEX))==0 .
29900 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c         && pLevel
29910 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66  ->iIdxCur!=pWInf
29920 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
29930 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1].      ){.    
29940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29950 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
29960 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
29970 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
29980 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
29990 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
299a0 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45  index, make VDBE
299b0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
299c0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
299d0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
299e0 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
299f0 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  f from the table
29a00 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
29a10 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a    In some cases.
29a20 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69      ** this opti
29a30 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74  mization prevent
29a40 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  s the table from
29a50 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64   ever being read
29a60 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20  , which can.    
29a70 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69  ** yield a signi
29a80 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e  ficant performan
29a90 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a  ce boost..    **
29aa0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
29ab0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
29ac0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
29ad0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29ae0 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
29af0 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
29b00 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
29b10 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
29b20 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
29b30 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
29b40 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
29b50 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
29b60 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
29b70 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
29b80 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
29b90 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
29ba0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
29bb0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
29bc0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
29bd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29be0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
29bf0 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
29c00 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
29c10 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
29c20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
29c30 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
29c40 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
29c50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
29c60 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
29c70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
29c80 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
29c90 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20     if( pIdx.    
29ca0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e   && (pWInfo->eOn
29cb0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
29cc0 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  FF || !HasRowid(
29cd0 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20  pIdx->pTable)). 
29ce0 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c      && !db->mall
29cf0 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a  ocFailed.    ){.
29d00 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
29d10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
29d20 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20  ddr(v);.      k 
29d30 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f  = pLevel->addrBo
29d40 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20  dy;.      pOp = 
29d50 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
29d60 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f  (v, k);.      fo
29d70 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  r(; k<last; k++,
29d80 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
29d90 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
29da0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
29db0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
29dc0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
29dd0 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
29de0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
29df0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
29e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
29e10 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
29e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29e30 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
29e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29e50 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
29e60 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
29e70 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
29e80 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
29e90 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
29ea0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29eb0 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
29ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
29ed0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
29ee0 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
29ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29f00 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
29f10 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
29f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
29f30 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
29f40 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
29f50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
29f60 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
29f70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
29f80 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e  X_ONLY)==0 || x>
29f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  =0 );.        }e
29fa0 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
29fb0 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
29fc0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
29fd0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
29fe0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
29ff0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
2a000 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
2a010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a020 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
2a030 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
2a040 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2a050 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2a060 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2a070 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2a080 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
2a090 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.