/ Hex Artifact Content
Login

Artifact 2786a5f385dedd67e9cedaa00645bf44444f3c68:


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 3a  ty scan regions:
e040: 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
e050: 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ]));.  *pnRow = 
e060: 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72  a[1];.  .  retur
e070: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e080: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
e090: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
e0a0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
e0b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e0c0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
e0d0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
e0e0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
e0f0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
e100: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
e110: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
e120: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
e130: 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
e140: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
e150: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
e160: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
e170: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
e180: 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
e190: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
e1a0: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
e1b0: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
e1c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e1d0: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
e1e0: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
e1f0: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
e200: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
e210: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
e220: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
e230: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
e240: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
e250: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
e260: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
e270: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
e280: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
e290: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
e2a0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
e2b0: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
e2c0: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
e2d0: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
e2e0: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
e2f0: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
e300: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
e310: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e320: 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
e330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e340: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
e350: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
e360: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
e370: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
e380: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
e390: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e3a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
e3b0: 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
e3c0: 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
e3d0: 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
e3e0: 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
e3f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e400: 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
e410: 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
e420: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
e430: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
e440: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
e450: 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c   i64 nRow0 = sql
e460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
e470: 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  p->aiRowLogEst[0
e480: 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ]);.  int nRecVa
e490: 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
e4a0: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
e4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e4c0: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
e4d0: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
e4e0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
e4f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
e500: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
e510: 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
e520: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
e530: 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
e540: 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
e550: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e560: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e5a0: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
e5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e5c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
e5d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e5e0: 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f  {.    nEst = nRo
e5f0: 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w0;.    rc = whe
e600: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
e610: 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
e620: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
e630: 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
e640: 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
e650: 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
e660: 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
e670: 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
e680: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e690: 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
e6a0: 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77  t > nRow0 ) nRow
e6b0: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
e6c0: 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
e6d0: 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
e6e0: 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20  E(0x10,("IN row 
e6f0: 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64  estimate: est=%d
e700: 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
e710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
e720: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e730: 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  d==nRecValid );.
e740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e750: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e760: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e770: 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65  STAT4 */...#ifde
e780: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
e790: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
e7a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
e7b0: 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  a WhereTerm obje
e7c0: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
e7d0: 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74  d whereTermPrint
e7e0: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
e7f0: 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20  m, int iTerm){. 
e800: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
e810: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e820: 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
e830: 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72  3d NULL\n", iTer
e840: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
e850: 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
e860: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
e870: 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20  , "...", 4);.   
e880: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
e890: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
e8a0: 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20  AL ) zType[0] = 
e8b0: 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65  'V';.    if( pTe
e8c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e8d0: 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70  WO_EQUIV  ) zTyp
e8e0: 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20  e[1] = 'E';.    
e8f0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
e900: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
e910: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
e920: 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
e930: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e940: 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
e950: 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73  "TERM-%-3d %p %s
e960: 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f   cursor=%-3d pro
e970: 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78  b=%-3d op=0x%03x
e980: 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78 5c   wtFlags=0x%04x\
e990: 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  n",.       iTerm
e9a0: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
e9b0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
e9c0: 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  r, pTerm->truthP
e9d0: 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72  rob,.       pTer
e9e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54  m->eOperator, pT
e9f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20  erm->wtFlags);. 
ea00: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
ea10: 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d  ewExpr(0, pTerm-
ea20: 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >pExpr, 0);.  }.
ea30: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
ea40: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
ea50: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
ea60: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
ea70: 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
ea80: 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
ea90: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
eaa0: 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
eab0: 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
eac0: 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
ead0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
eae0: 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
eaf0: 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
eb00: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
eb10: 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
eb20: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
eb30: 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
eb40: 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
eb50: 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
eb60: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
eb70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
eb80: 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
eb90: 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
eba0: 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
ebb0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
ebc0: 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
ebd0: 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
ebe0: 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
ebf0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
ec00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ec10: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
ec20: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
ec30: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
ec40: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
ec50: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ec60: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
ec70: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
ec80: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
ec90: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
eca0: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
ecb0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
ecc0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
ece0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
ecf0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
ed00: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
ed10: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
ed20: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
ed30: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
ed40: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
ed50: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
ed60: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
ed70: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ed80: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
ed90: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
eda0: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
edb0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
edc0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
edd0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
ede0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
edf0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
ee00: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
ee10: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
ee20: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
ee30: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
ee40: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
ee50: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
ee60: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
ee70: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
ee80: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
ee90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eea0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
eeb0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
eec0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
eed0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
eee0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
eef0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ef00: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
ef10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ef20: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
ef30: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
ef40: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
ef50: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
ef60: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
ef70: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
ef80: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
ef90: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
efa0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
efb0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
efc0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
efd0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
efe0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
eff0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f000: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f010: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f020: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f030: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f040: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f050: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f060: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f070: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f080: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f090: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f0a0: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f0b0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f0c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f0d0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f0e0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f0f0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f100: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f110: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f120: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f130: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f140: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f150: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f160: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f170: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f180: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f190: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f1a0: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f1b0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f1c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f1d0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f1e0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f1f0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f200: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f210: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f220: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f230: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f240: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f250: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f260: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f270: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f280: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f290: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f2a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f2b0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f2c0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f2d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f2e0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f2f0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f300: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f310: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f320: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f330: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f340: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f350: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f360: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f390: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f3a0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f3b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f3c0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f3d0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f3e0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f3f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f400: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
f410: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
f420: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
f430: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
f440: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f450: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
f460: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
f470: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
f480: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
f490: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
f4a0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
f4b0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
f4c0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
f4d0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
f4e0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
f4f0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
f500: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
f510: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
f520: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
f530: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
f540: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
f550: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
f560: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
f570: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
f580: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
f590: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
f5a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f5b0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
f5c0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
f5d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
f5e0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
f5f0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
f600: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
f610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f620: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
f630: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
f640: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
f650: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
f660: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
f670: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
f680: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
f690: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
f6a0: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
f6b0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
f6c0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
f6d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f6e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
f6f0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
f700: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
f710: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
f720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f730: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
f740: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f750: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
f760: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
f770: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
f780: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
f790: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
f7a0: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
f7b0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
f7c0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
f7d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
f7e0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
f7f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f800: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
f810: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
f820: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
f830: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
f840: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
f850: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
f860: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
f870: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
f880: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
f890: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
f8a0: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
f8b0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
f8c0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
f8d0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
f8e0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
f8f0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
f900: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
f910: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
f920: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f930: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
f940: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
f950: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
f960: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f970: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
f980: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f990: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
f9a0: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
f9b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f9c0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
f9d0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
f9e0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
f9f0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fa00: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
fa10: 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
fa20: 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
fa30: 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
fa40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
fa50: 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
fa60: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
fa70: 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
fa80: 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
fa90: 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
faa0: 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
fab0: 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
fac0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
fad0: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
fae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
faf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
fb00: 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
fb10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fb20: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
fb30: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
fb40: 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
fb50: 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
fb60: 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
fb70: 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
fb80: 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
fb90: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
fba0: 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
fbb0: 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
fbc0: 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
fbd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fbe0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
fbf0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
fc00: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
fc10: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
fc20: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
fc30: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
fc40: 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
fc50: 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
fc60: 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
fc70: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fc80: 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
fc90: 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
fca0: 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
fcb0: 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
fcc0: 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
fcd0: 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
fce0: 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
fcf0: 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
fd00: 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
fd10: 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
fd20: 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
fd30: 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
fd40: 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
fd50: 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
fd60: 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
fd70: 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
fd80: 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
fd90: 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
fda0: 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
fdb0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
fdc0: 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
fdd0: 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
fde0: 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
fdf0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
fe00: 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
fe10: 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
fe20: 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
fe30: 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
fe40: 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
fe50: 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
fe60: 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
fe70: 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
fe80: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
fe90: 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
fea0: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
feb0: 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
fec0: 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
fed0: 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
fee0: 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
fef0: 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
ff00: 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
ff10: 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
ff20: 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
ff30: 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
ff40: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
ff50: 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
ff60: 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
ff70: 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
ff80: 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
ff90: 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
ffa0: 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
ffb0: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
ffc0: 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
ffd0: 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
ffe0: 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
fff0: 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
10000 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10010 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10020 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10030 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10040 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10050 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10060 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10070 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10080 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10090 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
100a0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
100b0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
100c0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
100d0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
100e0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
100f0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
10100 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10110 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10120 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10130 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10140 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10150 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10160 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10170 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10180 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10190 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
101a0 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
101b0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
101c0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
101d0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
101e0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
101f0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
10200 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10210 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10220 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10230 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10240 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10250 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10260 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10270 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10280 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10290 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
102a0 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
102b0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
102c0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
102d0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
102e0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
102f0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10300 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10310 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10320 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10330 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10340 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10350 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10360 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10370 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10390 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
103a0 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
103b0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
103c0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
103d0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
103e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
103f0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
10400 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10410 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10420 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10430 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10440 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10450 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10460 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10470 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10480 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10490 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
104a0 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
104b0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
104c0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
104d0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
104e0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
104f0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10500 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10510 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10520 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10530 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10540 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10550 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10580 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10590 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
105a0 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
105b0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
105c0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
105d0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
105e0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
105f0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10600 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10610 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10620 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10630 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10640 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10650 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10660 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10670 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10680 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10690 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
106a0 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
106b0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
106c0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
106d0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
106e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
106f0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10700 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10710 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10720 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10730 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10740 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10750 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10760 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10770 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10790 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
107a0 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
107b0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
107c0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
107d0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
107e0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
107f0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10800 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10810 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10820 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10830 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10840 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10850 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10860 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10870 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10880 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10890 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
108a0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
108b0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
108c0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
108d0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
108e0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
108f0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10900 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10910 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10920 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10930 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10940 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10950 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10960 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10970 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10980 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10990 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
109a0 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
109b0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
109c0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
109d0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
109e0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
109f0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10a00 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
10a10 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
10a20 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
10a30 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
10a40 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
10a50 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
10a60 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
10a70 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
10a80 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
10a90 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
10aa0 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
10ab0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
10ac0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
10ad0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
10ae0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
10af0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
10b00 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
10b10 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
10b20 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
10b30 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
10b40 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
10b50 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
10b60 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
10b70 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
10b80 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
10b90 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
10ba0 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
10bb0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
10bc0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
10bd0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
10be0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
10bf0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
10c00 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
10c10 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
10c20 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
10c30 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10c50 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
10c60 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
10c70 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
10c80 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
10c90 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
10ca0 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
10cb0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
10cc0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
10cd0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
10ce0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
10cf0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
10d00 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
10d10 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
10d20 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
10d30 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
10d40 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
10d50 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
10d60 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
10d70 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
10d80 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
10d90 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
10da0 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
10db0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
10dc0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
10dd0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
10de0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
10df0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
10e00 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
10e10 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
10e20 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
10e30 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
10e40 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
10e50 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
10e60 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
10e70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
10e80 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
10e90 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
10ea0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
10eb0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
10ec0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
10ed0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
10ee0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
10ef0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
10f00 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
10f10 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
10f20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10f30 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
10f40 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
10f50 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
10f60 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
10f70 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
10f80 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
10f90 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
10fa0 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
10fb0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
10fc0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
10fd0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
10fe0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
10ff0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
11000 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11010 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11020 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11030 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11040 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11050 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11060 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11070 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11080 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11090 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
110a0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
110b0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
110c0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
110d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
110e0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
110f0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
11100 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11120 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11130 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11140 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11150 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11160 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11170 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11180 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11190 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
111a0 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
111b0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
111c0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
111d0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
111e0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
111f0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
11200 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11210 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11220 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11230 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11240 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11250 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11260 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11270 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11280 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11290 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
112a0 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
112b0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
112c0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
112f0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
11300 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11330 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11340 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11350 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11360 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11370 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11380 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11390 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
113a0 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
113b0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
113c0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
113d0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
113e0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
113f0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
11400 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11410 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11420 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11430 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11440 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11450 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11460 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11470 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11480 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11490 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
114a0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
114b0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
114c0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
114d0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
114e0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
114f0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11500 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11510 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11520 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11530 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11540 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11550 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11560 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11570 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11580 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11590 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
115a0 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
115b0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
115c0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
115d0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
115e0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
115f0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11600 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11610 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11620 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11630 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11640 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11650 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11660 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11670 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11680 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11690 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
116a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
116b0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
116c0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
116d0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
116e0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
116f0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11700 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11710 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11720 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11730 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11740 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11750 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11760 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11770 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11780 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11790 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
117a0 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
117b0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
117c0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
117d0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
117e0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
117f0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11800 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11810 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11820 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11830 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11840 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11850 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11860 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11870 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11880 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11890 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
118a0 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
118b0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
118c0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
118d0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
118e0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
118f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
11900 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
11910 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65 64  OrSet is defined
11920 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70  , then only keep
11930 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f   track of the co
11940 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65  sts.  ** and pre
11950 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  reqs..  */.  if(
11960 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11970 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t!=0 ){.    if( 
11980 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
11990 6d 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  m ){.#if WHERETR
119a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
119b0 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64    u16 n = pBuild
119c0 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20  er->pOrSet->n;. 
119d0 20 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e       int x =.#en
119e0 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4f  dif.      whereO
119f0 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
11a00 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
11a10 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
11a20 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
11a60 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
11a70 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
11a80 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
11a90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11aa0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
11ab0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11ac0 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
11ad0 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
11ae0 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77  ", n);.        w
11af0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
11b00 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
11b10 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  r->pWC);.      }
11b20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  OK;.  }..  /* Lo
11b50 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
11b60 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
11b70 72 65 70 6c 61 63 65 20 77 69 74 68 20 70 54 65  replace with pTe
11b80 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68  mplate.  */.  wh
11b90 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73  ereLoopAdjustCos
11ba0 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t(pWInfo->pLoops
11bb0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
11bc0 70 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f  ppPrev = whereLo
11bd0 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57  opFindLesser(&pW
11be0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
11bf0 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28  emplate);..  if(
11c00 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20   ppPrev==0 ){.  
11c10 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61    /* There alrea
11c20 64 79 20 65 78 69 73 74 73 20 61 20 57 68 65 72  dy exists a Wher
11c30 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73  eLoop on the lis
11c40 74 20 74 68 61 74 20 69 73 20 62 65 74 74 65 72  t that is better
11c50 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65  .    ** than pTe
11c60 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20  mplate, so just 
11c70 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65  ignore pTemplate
11c80 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
11c90 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
11ca0 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
11cb0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
11cc0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
11cd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11ce0 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20  ("   skip: ");. 
11cf0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
11d00 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
11d10 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11d20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d40 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;  .  }else{.   
11d50 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20   p = *ppPrev;.  
11d60 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
11d70 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ach this point i
11d80 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
11d90 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62  her p[] should b
11da0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20  e overwritten.  
11db0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
11dc0 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74  e[] if p[] exist
11dd0 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c  s, or if p==NULL
11de0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
11df0 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c   new.  ** WhereL
11e00 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69  oop and insert i
11e10 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52  t..  */.#if WHER
11e20 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
11e30 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73  * 0x8 */.  if( s
11e40 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11e50 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66   & 0x8 ){.    if
11e60 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p!=0 ){.      
11e70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11e80 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b  tf("replace: ");
11e90 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
11ea0 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65  Print(p, pBuilde
11eb0 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  r->pWC);.    }. 
11ec0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11ed0 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a 20  rintf("    add: 
11ee0 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
11ef0 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
11f00 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
11f10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
11f20 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( p==0 ){.    /
11f30 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
11f40 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64   WhereLoop to ad
11f50 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
11f60 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  the list */.    
11f70 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71  *ppPrev = p = sq
11f80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11f90 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  NN(db, sizeof(Wh
11fa0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
11fb0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
11fc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
11fd0 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  PT;.    whereLoo
11fe0 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
11ff0 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
12000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12010 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
12020 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
12030 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
12040 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
12050 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
12060 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
12070 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
12080 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
12090 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
120a0 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
120b0 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
120c0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
120d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
120e0 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
120f0 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
12100 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
12110 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
12120 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
12130 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
12140 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
12150 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
12160 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
12170 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
12180 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
12190 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
121a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
121b0 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
121c0 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
121d0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
121e0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
121f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12200 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
12210 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
12220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12230 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
12240 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
12250 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
12260 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
12270 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12280 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
12290 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
122a0 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
122b0 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
122c0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
122d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
122e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
122f0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
12300 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
12310 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
12320 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
12330 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
12340 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
12350 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
12360 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
12370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
12390 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
123a0 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
123b0 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
123c0 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
123d0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
123e0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
123f0 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
12400 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
12410 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
12420 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
12430 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
12440 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
12450 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
12460 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
12470 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12480 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
12490 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
124a0 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
124b0 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
124c0 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
124d0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
124e0 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
124f0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
12500 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
12510 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
12520 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
12530 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
12540 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
12550 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
12560 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
12570 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
12580 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
12590 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
125a0 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
125b0 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
125c0 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
125d0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
125e0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
125f0 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
12600 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
12610 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
12620 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
12630 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
12640 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
12650 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
12660 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
12670 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
12680 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
12690 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
126a0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
126b0 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
126c0 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
126d0 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
126e0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
126f0 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
12700 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
12710 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
12720 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
12730 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
12740 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
12750 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
12760 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
12770 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
12780 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
12790 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
127a0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
127b0 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
127c0 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
127d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
127e0 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
127f0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
12800 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
12810 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12820 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
12830 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
12840 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
12850 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
12860 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
12870 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
12880 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
12890 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
128a0 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
128b0 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
128c0 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
128d0 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
128e0 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
128f0 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
12900 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
12910 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
12920 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
12930 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
12940 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
12950 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
12960 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
12970 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
12980 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
12990 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
129a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
129b0 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
129c0 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
129d0 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
129e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
129f0 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
12a00 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
12a10 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
12a20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
12a30 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
12a40 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
12a50 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
12a60 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
12a70 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
12a80 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
12a90 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
12aa0 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
12ab0 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
12ac0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
12ad0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
12ae0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
12af0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
12b00 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
12b10 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
12b20 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
12b30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
12b40 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
12b50 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
12b60 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
12b70 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
12b80 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
12b90 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
12ba0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
12bb0 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
12bc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
12bd0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
12be0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
12bf0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
12c00 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
12c10 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
12c20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
12c30 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
12c40 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
12c50 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
12c60 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
12c70 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
12c80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12c90 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
12ca0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
12cb0 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
12cc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
12cd0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12ce0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
12cf0 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
12d00 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
12d10 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
12d20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
12d30 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
12d40 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
12d50 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
12d60 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
12d70 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
12d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
12d90 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
12da0 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
12db0 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
12dc0 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
12dd0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
12de0 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
12df0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12e00 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
12e10 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
12e20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
12e30 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
12e40 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
12e50 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
12e60 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
12e70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
12e80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12e90 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
12ea0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
12eb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12ec0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69  xprIsInteger(pRi
12ed0 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28  ght, &k) && k>=(
12ee0 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20  -1) && k<=1 ){. 
12ef0 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31             k = 1
12f00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
12f10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
12f20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20  k = 20;.        
12f30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
12f40 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52  ( iReduce<k ) iR
12f50 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20  educe = k;.     
12f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12f70 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
12f80 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d  op->nOut > nRow-
12f90 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70  iReduce )  pLoop
12fa0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20  ->nOut = nRow - 
12fb0 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iReduce;.}../*.*
12fc0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
12fd0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
12fe0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
12ff0 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
13000 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
13010 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
13020 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
13030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13040 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
13050 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
13060 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
13070 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
13080 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
13090 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
130a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
130b0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
130c0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
130d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
130e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
130f0 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
13100 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
13110 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
13120 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13130 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
13140 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
13150 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
13160 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13170 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
13180 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
13190 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
131a0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
131b0 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
131c0 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
131d0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
131e0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
131f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
13200 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
13210 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
13220 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
13230 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
13240 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
13250 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
13260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13270 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
13280 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
13290 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
132a0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
132b0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
132c0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
132d0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
132e0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
132f0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
13300 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
13310 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13330 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
13340 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
13350 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
13360 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
13370 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
13380 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
13390 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
133a0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
133b0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
133c0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
133d0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
133e0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
133f0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
13400 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13410 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
13420 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13430 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
13440 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13450 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
13460 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
13470 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
13480 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
13490 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
134a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
134b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
134c0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
134d0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
134e0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
134f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
13500 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
13510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13520 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
13530 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13540 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
13550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13560 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
13570 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
13580 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
13590 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
135a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
135b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
135c0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
135d0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
135e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
135f0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
13600 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
13610 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
13640 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
13650 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
13660 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
13690 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f  f pNew->nSkip */
136a0 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
136b0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
136c0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
136d0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
136e0 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
136f0 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
13700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13710 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13720 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
13730 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13740 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
13750 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
13760 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
13770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13790 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
137a0 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
137b0 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
137c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
137d0 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
137e0 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
137f0 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42  m *pTop = 0, *pB
13800 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61  tm = 0; /* Top a
13810 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
13820 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
13830 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
13840 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
13850 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13860 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13870 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 61  NOMEM_BKPT;..  a
13880 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
13890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
138a0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
138b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
138c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
138d0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
138e0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
138f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13900 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
13910 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
13920 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
13930 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75  f( /*pProbe->tnu
13940 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d  m<=0 ||*/ (pSrc-
13950 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
13960 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
13970 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
13980 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
13990 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
139a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
139b0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
139c0 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
139d0 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e  _LT|WO_LE|WO_ISN
139e0 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20  ULL|WO_IS;.  }. 
139f0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
13a00 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
13a10 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
13a20 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
13a30 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
13a40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
13a50 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
13a60 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
13a70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13a80 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
13a90 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20  = pNew->nSkip;. 
13aa0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
13ab0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
13ac0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
13ad0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
13ae0 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
13af0 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
13b00 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
13b10 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d  w->nOut;.  pTerm
13b20 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
13b30 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
13b40 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
13b50 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c  rsor, saved_nEq,
13b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b70 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
13b80 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77   pProbe);.  pNew
13b90 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
13ba0 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
13bb0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
13bc0 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
13bd0 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
13be0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
13bf0 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
13c00 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
13c10 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
13c20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
13c30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
13c40 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
13c50 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13c60 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
13c70 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
13c80 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
13c90 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
13ca0 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
13cb0 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
13cc0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
13cd0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
13ce0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13cf0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
13d00 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
13d10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
13d20 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
13d30 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
13d40 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
13d50 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
13d60 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
13d70 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
13d80 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65  ull(pProbe, save
13d90 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  d_nEq).    ){.  
13da0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
13db0 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
13dc0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13dd0 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
13de0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
13df0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
13e00 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
13e10 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
13e20 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
13e30 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
13e40 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
13e50 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
13e60 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
13e70 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
13e80 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
13e90 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
13ea0 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
13eb0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
13ec0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13ed0 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
13ee0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
13ef0 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
13f00 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
13f10 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
13f20 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
13f30 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
13f40 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
13f50 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
13f60 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
13f70 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13f80 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
13f90 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
13fa0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
13fb0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
13fc0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
13fd0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
13fe0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
13ff0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
14000 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
14010 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
14020 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
14030 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
14040 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
14050 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14060 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
14070 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
14080 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14090 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
140a0 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
140b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
140c0 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
140d0 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
140e0 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
140f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14100 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
14110 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14120 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
14130 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
14140 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
14150 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
14160 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
14170 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
14180 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
14190 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
141a0 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
141b0 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
141c0 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
141d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
141e0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
141f0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
14200 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
14210 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
14220 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
14230 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
14240 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
14250 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
14260 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
14270 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14280 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14290 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
142a0 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
142b0 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
142c0 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
142d0 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
142f0 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
14300 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
14310 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  /..    }else if(
14320 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
14330 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
14340 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
14350 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
14360 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
14370 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14380 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
14390 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
143a0 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
143b0 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
143c0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
143d0 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
143e0 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75  (iCol>0 && nInMu
143f0 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
14400 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
14410 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
14420 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
14430 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
14440 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
14450 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
14460 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14470 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
14480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14490 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
144a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
144b0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
144c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
144d0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
144e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
144f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14500 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
14510 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14520 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
14530 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
14540 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14550 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14560 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
14570 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
14580 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14590 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
145a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
145b0 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
145c0 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
145d0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
145e0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
145f0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
14600 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
14610 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
14620 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
14630 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
14640 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
14650 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
14660 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
14670 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
14680 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14690 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
146a0 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
146b0 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
146c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
146d0 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
146e0 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
146f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14700 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
14710 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
14720 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
14730 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
14740 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
14750 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
14760 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
14770 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
14780 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
14790 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
147a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
147b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
147c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
147d0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
147e0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
147f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14800 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
14810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14820 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
14830 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14840 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14850 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
14860 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
14870 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
14880 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
14890 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
148a0 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
148b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
148d0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
148e0 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
148f0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
14900 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
14910 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
14920 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
14930 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
14940 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
14950 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
14960 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
14970 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
14980 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
14990 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
149a0 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
149b0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
149c0 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
149d0 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
149e0 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
149f0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
14a00 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
14a10 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
14a20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
14a30 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
14a40 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
14a50 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
14a60 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14a70 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14a80 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
14a90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14aa0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
14ab0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
14ac0 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
14ad0 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
14ae0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
14af0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
14b00 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
14b10 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
14b20 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
14b30 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
14b40 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14b50 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
14b60 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
14b70 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
14b80 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
14b90 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
14ba0 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
14bb0 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
14bc0 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
14bd0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14be0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
14bf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
14c00 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
14c10 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
14c20 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
14c30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
14c40 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
14c50 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
14c60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14c70 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
14c80 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
14c90 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
14ca0 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
14cb0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
14cc0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
14cd0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
14ce0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14cf0 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
14d00 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
14d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
14d20 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
14d30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
14d40 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
14d50 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14d60 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
14d70 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
14d80 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
14d90 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
14da0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
14db0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14dc0 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
14dd0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14de0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14df0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
14e00 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
14e10 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
14e20 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
14e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14e40 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
14e50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14e60 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14e70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
14e80 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14e90 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
14ea0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
14eb0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14ec0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14ed0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
14ee0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
14ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f00 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14f10 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
14f20 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14f30 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
14f40 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14f50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14f60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14f70 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14f80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
14f90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14fa0 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
14fb0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
14fc0 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
14fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14fe0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
14ff0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15000 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
15010 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
15020 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
15030 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
15040 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
15050 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
15060 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
15070 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
15080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15090 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
150a0 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
150b0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
150c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
150d0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
150e0 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
150f0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
15100 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
15110 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
15120 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
15130 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
15140 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
15150 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
15160 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
15170 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
15180 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
15190 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
151a0 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
151b0 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
151c0 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
151d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
151e0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
151f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
15220 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
15230 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
15240 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
15250 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
15260 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
15270 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
15280 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
15290 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
152a0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
152b0 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
152c0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
152d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
152e0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
152f0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
15300 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
15310 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
15320 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
15330 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
15340 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
15350 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
15360 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
15370 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
15380 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
15390 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
153a0 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
153b0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
153c0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
153d0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
153e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
153f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
15400 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
15410 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
15420 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
15430 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
15440 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
15450 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
15460 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
15470 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
15480 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
15490 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
154a0 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
154b0 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
154c0 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
154d0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
154e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
154f0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
15500 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
15510 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
15520 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
15530 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15540 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15550 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
15560 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15570 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
15580 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15590 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
155a0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
155b0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
155c0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
155d0 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
155e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
155f0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
15600 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
15610 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
15620 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
15630 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
15640 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
15650 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15660 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
15670 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15680 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15690 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
156a0 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
156b0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
156c0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
156d0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
156e0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
156f0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
15700 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
15710 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
15720 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
15730 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
15740 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15750 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
15760 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15770 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
15780 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
15790 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
157a0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
157b0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
157c0 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
157d0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
157e0 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
157f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
15800 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
15810 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
15820 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
15830 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
15840 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
15850 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
15860 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
15870 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
15880 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
15890 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
158a0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
158b0 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
158c0 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
158d0 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
158e0 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
158f0 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
15900 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
15910 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
15920 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
15930 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
15940 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
15950 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
15960 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
15970 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
15980 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
15990 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
159a0 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
159b0 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
159c0 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
159d0 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
159e0 28 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  ( WHERE_SKIPSCAN
159f0 5f 4f 4e 53 45 54 5f 4c 4f 47 3d 3d 73 71 6c 69  _ONSET_LOG==sqli
15a00 74 65 33 4c 6f 67 45 73 74 28 57 48 45 52 45 5f  te3LogEst(WHERE_
15a10 53 4b 49 50 53 43 41 4e 5f 4f 4e 53 45 54 29 20  SKIPSCAN_ONSET) 
15a20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
15a30 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
15a40 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
15a50 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
15a60 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
15a70 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
15a80 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
15a90 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
15aa0 71 2b 31 5d 3e 3d 57 48 45 52 45 5f 53 4b 49 50  q+1]>=WHERE_SKIP
15ab0 53 43 41 4e 5f 4f 4e 53 45 54 5f 4c 4f 47 0a 20  SCAN_ONSET_LOG. 
15ac0 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
15ad0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
15ae0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
15af0 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
15b00 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
15b10 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
15b20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
15b30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
15b40 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
15b50 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
15b60 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
15b70 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15b80 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
15b90 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
15ba0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
15bb0 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
15bc0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15bd0 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
15be0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
15bf0 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55  nIter;.    /* TU
15c00 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75  NING:  Because u
15c10 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20  ncertainties in 
15c20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f  the estimates fo
15c30 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72  r skip-scan quer
15c40 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20  ies,.    ** add 
15c50 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61  a 1.375 fudge fa
15c60 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69  ctor to make ski
15c70 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20  p-scan slightly 
15c80 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a  less likely. */.
15c90 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a      nIter += 5;.
15ca0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
15cb0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
15cc0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
15cd0 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75  e, nIter + nInMu
15ce0 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  l);.    pNew->nO
15cf0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
15d00 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
15d10 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
15d20 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  Eq;.    pNew->nS
15d30 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
15d40 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  p;.    pNew->wsF
15d50 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
15d60 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  lags;.  }..  ret
15d70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15d80 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
15d90 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
15da0 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
15db0 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
15dc0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
15dd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15de0 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
15df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
15e00 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
15e10 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
15e20 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
15e30 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
15e40 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
15e50 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
15e60 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
15e70 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
15e80 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
15e90 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
15ea0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
15eb0 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
15ec0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
15ed0 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
15ee0 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
15ef0 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
15f00 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74  *pOB;.  ExprList
15f10 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e   *aColExpr;.  in
15f20 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
15f30 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
15f40 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
15f50 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
15f60 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
15f70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
15f80 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
15f90 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
15fa0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
15fb0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
15fc0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
15fd0 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
15fe0 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
15ff0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
16000 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
16010 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
16020 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16030 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
16040 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
16050 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
16060 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
16070 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
16080 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
16090 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
160a0 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
160b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
160c0 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d   if( (aColExpr =
160d0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
160e0 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)!=0 ){.      f
160f0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
16100 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
16110 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16120 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
16130 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20  [jj]!=XN_EXPR ) 
16140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16150 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16160 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61  rCompare(pExpr,a
16170 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70  ColExpr->a[jj].p
16180 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30  Expr,iCursor)==0
16190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
161a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
161b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
161c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
161d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
161e0 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
161f0 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
16200 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
16210 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
16220 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
16230 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
16240 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
16250 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
16260 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
16270 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
16280 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
16290 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
162a0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
162b0 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
162c0 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
162d0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
162e0 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
162f0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
16300 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
16310 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
16320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16330 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
16340 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
16350 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28   ) m |= MASKBIT(
16360 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
16370 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20  return m;.}../* 
16380 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
16390 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
163a0 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57  with pPartIndexW
163b0 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  here can be used
163c0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
163d0 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  nt query.  Retur
163e0 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e  n true if it can
163f0 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66   be and false if
16400 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
16410 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50  int whereUsableP
16420 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20  artialIndex(int 
16430 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73  iTab, WhereClaus
16440 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57  e *pWC, Expr *pW
16450 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  here){.  int i;.
16460 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
16470 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68  rm;.  while( pWh
16480 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
16490 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72  ){.    if( !wher
164a0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
164b0 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68  dex(iTab,pWC,pWh
164c0 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65  ere->pLeft) ) re
164d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65  turn 0;.    pWhe
164e0 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69  re = pWhere->pRi
164f0 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ght;.  }.  for(i
16500 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
16510 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
16520 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
16530 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
16540 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
16550 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16560 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
16570 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
16580 62 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78  b) .     && (!Ex
16590 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
165a0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
165b0 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67  ) || pExpr->iRig
165c0 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
165d0 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  b).    ){.      
165e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
165f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16600 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
16610 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
16620 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
16630 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
16640 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
16650 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64  e.** is idenfied
16660 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
16670 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
16680 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
16690 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62  eed to be.** a b
166a0 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74  -tree table, not
166b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
166c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74  ..**.** The cost
166d0 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75  s (WhereLoop.rRu
166e0 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  n) of the b-tree
166f0 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20   loops added by 
16700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
16710 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20   are calculated 
16720 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
16730 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61  * For a full sca
16740 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20  n, assuming the 
16750 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29  table (or index)
16760 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72   contains nRow r
16770 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ows:.**.**     c
16780 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30  ost = nRow * 3.0
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c      // full-tabl
167b0 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f  e scan.**     co
167c0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20  st = nRow * K   
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f     // scan of co
167f0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
16800 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
16810 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20  * (K+3.0)       
16820 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
16830 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   of non-covering
16840 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65   index.**.** whe
16850 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20  re K is a value 
16860 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
16870 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e  3.0 set based on
16880 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a   the relative .*
16890 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72  * estimated aver
168a0 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  age size of the 
168b0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
168c0 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  records..**.** F
168d0 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e  or an index scan
168e0 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69  , where nVisit i
168f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16900 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74  index rows visit
16910 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61  ed.** by the sca
16920 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20  n, and nSeek is 
16930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
16940 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65  ek operations re
16950 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68  quired on .** th
16960 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a  e index b-tree:.
16970 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  **.**     cost =
16980 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
16990 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74  ow) + K * nVisit
169a0 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f  )          // co
169b0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
169c0 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
169d0 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
169e0 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74  (K+3.0) * nVisit
169f0 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65  )    // non-cove
16a00 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
16a10 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b   Normally, nSeek
16a20 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c   is 1. nSeek val
16a30 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
16a40 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66   1 come about if
16a50 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63   the .** WHERE c
16a60 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22  lause includes "
16a70 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72  x IN (....)" ter
16a80 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ms used in place
16a90 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68   of "x=?". Or wh
16aa0 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20  en .** implicit 
16ab0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20  "x IN (SELECT x 
16ac0 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73  FROM tbl)" terms
16ad0 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73   are added for s
16ae0 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a  kip-scans..**.**
16af0 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76   The estimated v
16b00 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69  alues (nRow, nVi
16b10 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65  sit, nSeek) ofte
16b20 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67  n contain a larg
16b30 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75  e amount.** of u
16b40 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72  ncertainty.  For
16b50 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63   this reason, sc
16b60 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65  oring is designe
16b70 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20  d to pick plans 
16b80 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20  that.** "do the 
16b90 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74  least harm" if t
16ba0 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65  he estimates are
16bb0 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f   inaccurate.  Fo
16bc0 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20  r example, a.** 
16bd0 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72  log(nRow) factor
16be0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
16bf0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
16c00 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72  index scan in or
16c10 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74  der to.** bias t
16c20 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61  he scoring in fa
16c30 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  vor of using an 
16c40 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65  index, since the
16c50 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70   worst-case.** p
16c60 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73  erformance of us
16c70 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20  ing an index is 
16c80 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20  far better than 
16c90 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70  the worst-case p
16ca0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66  erformance.** of
16cb0 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
16cc0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
16cd0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
16ce0 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
16cf0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
16d00 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
16d10 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
16d20 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
16d30 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
16d40 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
16d50 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
16d60 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
16d70 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
16d80 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
16d90 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
16da0 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
16db0 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
16dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
16dd0 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
16de0 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
16df0 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
16e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
16e10 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
16e20 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
16e30 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74   key */.  LogEst
16e40 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
16e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
16e60 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65  owLogEst[] value
16e70 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
16e80 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f  ex */.  i16 aiCo
16e90 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
16ea0 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
16eb0 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
16ec0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
16ed0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
16ee0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
16ef0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
16f00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
16f10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
16f20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
16f30 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
16f40 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
16f50 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
16f60 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
16f70 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
16f80 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
16f90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16fa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16fb0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
16fc0 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
16fd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
16fe0 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
16ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17000 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
17010 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c  ean value */.  L
17020 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
17030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
17040 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17050 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
17060 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
17070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
17080 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
17090 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
170a0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
170b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
170c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
170d0 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20  he parsed WHERE 
170e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c  clause */.  Tabl
170f0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
17100 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
17110 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
17120 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42  /.  .  pNew = pB
17130 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
17140 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
17150 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61  r->pWInfo;.  pTa
17160 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
17170 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63  pTabList;.  pSrc
17180 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
17190 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70   pNew->iTab;.  p
171a0 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
171b0 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
171c0 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72  er->pWC;.  asser
171d0 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
171e0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
171f0 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64  if( pSrc->pIBInd
17200 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
17210 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
17220 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
17230 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
17240 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
17250 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49  obe = pSrc->pIBI
17260 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ndex;.  }else if
17270 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
17280 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  ) ){.    pProbe 
17290 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
172a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
172b0 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
172c0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
172d0 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
172e0 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
172f0 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
17300 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
17310 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
17320 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
17330 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
17340 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
17350 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
17360 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
17370 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
17380 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
17390 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
173a0 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
173b0 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
173c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
173d0 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
173e0 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
173f0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
17400 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
17410 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
17420 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  KeyCol = 1;.    
17430 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
17440 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
17450 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
17460 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f  .    sPk.aiRowLo
17470 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  gEst = aiRowEstP
17480 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
17490 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
174a0 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
174b0 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e  = pTab;.    sPk.
174c0 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d  szIdxRow = pTab-
174d0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61  >szTabRow;.    a
174e0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
174f0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
17500 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
17510 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72  1] = 0;.    pFir
17520 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
17530 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
17540 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64   pSrc->fg.notInd
17550 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
17560 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
17570 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
17580 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
17590 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
175a0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
175b0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
175c0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
175d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
175e0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
175f0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
17600 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
17610 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
17620 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
17630 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
17640 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23  stLog(rSize);..#
17650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17660 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
17670 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  EX.  /* Automati
17680 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  c indexes */.  i
17690 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f  f( !pBuilder->pO
176a0 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74  rSet      /* Not
176b0 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f   part of an OR o
176c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  ptimization */. 
176d0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
176e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
176f0 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d 3d  _NO_AUTOINDEX)==
17700 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
17710 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
17720 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
17730 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
17740 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d  pSrc->pIBIndex==
17750 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f  0      /* Has no
17760 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
17770 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  se */.   && !pSr
17780 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  c->fg.notIndexed
17790 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54     /* Has no NOT
177a0 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
177b0 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69  */.   && HasRowi
177c0 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20  d(pTab)         
177d0 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52  /* Not WITHOUT R
177e0 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58  OWID table. (FIX
177f0 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f  ME: Why not?) */
17800 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
17810 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a  .isCorrelated /*
17820 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65   Not a correlate
17830 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  d subquery */.  
17840 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
17850 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f  Recursive  /* No
17860 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f  t a recursive co
17870 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
17880 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20  ssion. */.  ){. 
17890 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
178a0 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
178b0 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
178c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
178d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
178e0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
178f0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
17900 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
17910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17920 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
17930 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
17940 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
17950 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
17960 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
17970 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
17980 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
17990 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
179a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
179b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
179c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
179d0 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
179e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
179f0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
17a00 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
17a10 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
17a20 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
17a30 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
17a40 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
17a50 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
17a60 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
17a70 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
17a80 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74        ** estimat
17a90 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67  ed to be X*N*log
17aa0 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
17ab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17ac0 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
17ad0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
17ae0 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65   indexed and whe
17af0 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73  re X is 7 (LogEs
17b00 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c  t=28) for normal
17b10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
17b20 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67  es or 1.375 (Log
17b30 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73  Est=4) for views
17b40 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e   and subqueries.
17b50 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20    The value.    
17b60 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73      ** of X is s
17b70 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73  maller for views
17b80 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
17b90 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72  so that the quer
17ba0 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20  y planner.      
17bb0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72    ** will be mor
17bc0 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f  e aggressive abo
17bd0 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75  ut generating au
17be0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
17bf0 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  for.        ** t
17c00 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69  hose objects, si
17c10 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  nce there is no 
17c20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61  opportunity to a
17c30 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20  dd schema.      
17c40 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20    ** indexes on 
17c50 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76  subqueries and v
17c60 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iews. */.       
17c70 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
17c80 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
17c90 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66   + 4;.        if
17ca0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
17cb0 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  =0 && (pTab->tab
17cc0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
17cd0 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eral)==0 ){.    
17ce0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
17cf0 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20  up += 24;.      
17d00 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
17d10 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
17d20 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54  pNew->rSetup, pT
17d30 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
17d40 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17d50 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
17d60 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
17d70 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
17d80 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
17d90 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
17da0 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
17db0 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
17dc0 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
17dd0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
17de0 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  owing how select
17df0 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
17e00 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
17e10 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
17e20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
17e30 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
17e40 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
17e50 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
17e60 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17e70 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
17e80 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
17e90 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
17ea0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
17eb0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
17ec0 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
17ed0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
17ee0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
17ef0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
17f00 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
17f10 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70  req = mExtra | p
17f20 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
17f30 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
17f40 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
17f50 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
17f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17f70 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
17f80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
17f90 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
17fa0 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
17fb0 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
17fc0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
17fd0 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
17fe0 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
17ff0 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
18000 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
18010 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
18020 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
18030 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
18040 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  ex(pSrc->iCursor
18050 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
18060 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
18070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18080 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72   pNew->iTab!=pSr
18090 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  c->iCursor );  /
180a0 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38  * See ticket [98
180b0 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20  d973b8f5] */.   
180c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
180d0 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69   Partial index i
180e0 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72  nappropriate for
180f0 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
18100 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d     }.    rSize =
18110 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
18120 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65  gEst[0];.    pNe
18130 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
18140 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53   0;.    pNew->nS
18150 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
18160 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
18170 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
18180 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
18190 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
181a0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
181b0 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
181c0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
181d0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
181e0 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
181f0 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
18200 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
18210 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
18220 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
18230 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
18240 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
18250 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
18260 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
18270 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
18280 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
18290 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
182a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
182b0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
182c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
182d0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
182e0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
182f0 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
18300 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
18310 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
18320 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
18330 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
18340 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
18350 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18360 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
18370 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
18380 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
18390 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
183a0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
183b0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
183c0 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
183d0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
183e0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
183f0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
18400 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18410 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18420 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18430 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
18440 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
18450 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
18460 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
18470 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
18480 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
18490 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
184a0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
184b0 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
184c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
184d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
184e0 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
184f0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
18500 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
18510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
18520 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
18530 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
18540 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
18550 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
18560 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
18570 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
18580 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
18590 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
185a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
185b0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
185c0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
185d0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
185e0 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
185f0 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
18600 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
18610 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
18620 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
18630 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
18640 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
18650 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
18660 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
18670 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
18680 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
18690 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
186a0 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
186b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
186c0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
186d0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
186e0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
186f0 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
18700 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
18710 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
18720 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
18730 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
18740 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
18750 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
18760 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
18770 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
18780 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
18790 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
187a0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
187b0 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
187c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
187d0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
187e0 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ows. If this is 
187f0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
18800 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20  ndex scan,.     
18810 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74     ** also add t
18820 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
18830 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28  ing table rows (
18840 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20  N*3.0).  */.    
18850 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
18860 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
18870 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
18880 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
18890 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
188a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
188b0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
188c0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
188d0 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65  New->rRun, rSize
188e0 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +16);.        }.
188f0 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
18900 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
18910 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
18920 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
18930 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
18940 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
18950 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
18960 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18970 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
18980 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
18990 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
189a0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
189b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
189c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
189d0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
189e0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
189f0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
18a00 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
18a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18a20 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
18a30 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
18a40 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
18a50 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
18a60 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
18a70 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
18a80 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
18a90 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
18aa0 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
18ab0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
18ac0 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
18ad0 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
18ae0 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
18af0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42     if( pSrc->pIB
18b00 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
18b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18b20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
18b30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
18b40 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  BLE./*.** Add al
18b50 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
18b60 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  cts for a table 
18b70 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e  of the join iden
18b80 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75  tified by.** pBu
18b90 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
18ba0 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
18bb0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
18bc0 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
18bd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
18be0 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f  re are no LEFT o
18bf0 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69  r CROSS JOIN joi
18c00 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c  ns in the query,
18c10 20 62 6f 74 68 20 6d 45 78 74 72 61 20 61 6e 64   both mExtra and
18c20 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
18c30 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
18c40 72 77 69 73 65 2c 20 6d 45 78 74 72 61 20 69 73  rwise, mExtra is
18c50 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46   a mask of all F
18c60 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e  ROM clause.** en
18c70 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
18c80 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74   before the virt
18c90 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ual table in the
18ca0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
18cb0 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65   are.** separate
18cc0 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
18cd0 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
18ce0 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69  r CROSS JOIN. Si
18cf0 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20  milarly, the.** 
18d00 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63  mUnusable mask c
18d10 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d  ontains all FROM
18d20 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20   clause entries 
18d30 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72  that occur after
18d40 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
18d50 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65  table and are se
18d60 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
18d70 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
18d80 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53  LEFT or .** CROS
18d90 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46  S JOIN. .**.** F
18da0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
18db0 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a  he query were:.*
18dc0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
18dd0 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
18de0 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53   t3, t4, vt CROS
18df0 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a  S JOIN t5, t6;.*
18e00 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74 72 61  *.** then mExtra
18e10 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
18e20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e  (t1, t2) and mUn
18e30 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74  usable to (t5, t
18e40 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  6)..**.** All th
18e50 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 45 78 74  e tables in mExt
18e60 72 61 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  ra must be scann
18e70 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ed before the cu
18e80 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a  rrent virtual .*
18e90 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20  * table. So any 
18ea0 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20  terms for which 
18eb0 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74 65  all prerequisite
18ec0 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  s are satisfied 
18ed0 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20 6d 61  by .** mExtra ma
18ee0 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61  y be specified a
18ef0 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c  s "usable" in al
18f00 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  l calls to xBest
18f10 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65  Index. .** Conve
18f20 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65  rsely, all table
18f30 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d  s in mUnusable m
18f40 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
18f50 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
18f60 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
18f70 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20  e, so any terms 
18f80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72  for which the pr
18f90 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72  erequisites over
18fa0 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75  lap with.** mUnu
18fb0 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77  sable should alw
18fc0 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65  ays be configure
18fd0 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65  d as "not-usable
18fe0 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78  " for xBestIndex
18ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19000 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
19010 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
19020 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
19030 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
19040 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
19050 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
19060 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
19070 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
19080 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
19090 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65   before this one
190a0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
190b0 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20  nusable         
190c0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
190d0 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
190e0 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65  d after this one
190f0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
19100 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
19110 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
19120 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
19130 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
19140 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
19150 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
19160 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
19170 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
19180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19190 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
191a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
191b0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
191c0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
191d0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
191e0 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
191f0 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
19200 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
19210 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
19220 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
19230 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
19240 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
19250 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
19260 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
19270 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
19280 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
19290 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
192a0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
192b0 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
192c0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
192d0 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
192e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
192f0 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
19300 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
19310 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19330 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
19340 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
19350 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
19360 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
19370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
19380 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
19390 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
193a0 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
193b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
193c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
193d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
193e0 28 20 28 6d 45 78 74 72 61 20 26 20 6d 55 6e 75  ( (mExtra & mUnu
193f0 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70  sable)==0 );.  p
19400 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
19410 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
19420 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
19430 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
19440 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
19450 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
19460 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
19470 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
19480 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
19490 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
194a0 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
194b0 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
194c0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
194d0 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
194e0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
194f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
19500 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
19510 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65  ,pBuilder->pOrde
19520 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78  rBy);.  if( pIdx
19530 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
19540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
19550 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  PT;.  pNew->prer
19560 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
19570 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
19580 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
19590 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
195a0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
195b0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
195c0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
195d0 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
195e0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
195f0 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
19600 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
19610 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
19620 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
19630 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
19640 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
19650 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19660 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
19670 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
19680 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19690 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
196a0 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
196b0 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
196c0 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
196d0 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
196e0 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
196f0 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
19700 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
19710 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
19720 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
19730 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
19740 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
19750 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19760 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
19770 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
19780 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19790 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
197a0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
197b0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
197c0 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
197d0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
197e0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
197f0 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
19800 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
19810 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
19820 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
19830 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
19840 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
19850 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19860 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
19870 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
19880 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
19890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
198a0 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
198b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
198c0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
198d0 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74  reqRight & ~mExt
198e0 72 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ra)!=0 ){.      
198f0 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
19900 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
19910 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
19920 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
19930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19940 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
19950 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
19960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19980 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
19990 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
199a0 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
199b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
199c0 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
199d0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
199e0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
199f0 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74  reqRight & ~mExt
19a00 72 61 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  ra)==0;.        
19a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19a20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
19a30 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
19a40 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
19a50 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
19a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
19a70 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19a80 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19a90 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
19aa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19ab0 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
19ac0 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
19ad0 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
19ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
19af0 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
19b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
19b10 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
19b20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
19b30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19b40 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
19b50 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
19b60 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
19b70 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
19b80 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
19b90 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
19ba0 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
19bb0 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
19bc0 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
19bd0 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
19be0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19bf0 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
19c00 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19c10 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
19c20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
19c30 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
19c40 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
19c50 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
19c60 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
19c70 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
19c80 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19c90 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
19ca0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46    pIdxInfo->idxF
19cb0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 49  lags = 0;.    pI
19cc0 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20  dxInfo->colUsed 
19cd0 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
19ce0 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a  )pSrc->colUsed;.
19cf0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
19d00 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
19d10 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
19d20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
19d30 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
19d40 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
19d50 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
19d60 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19d70 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
19d80 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
19d90 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
19da0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
19db0 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
19dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
19dd0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
19de0 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
19df0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
19e00 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
19e10 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
19e20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19e30 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
19e40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
19e50 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
19e60 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
19e70 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
19e80 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
19e90 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
19ea0 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
19eb0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
19ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
19ed0 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
19ee0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
19ef0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
19f00 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
19f10 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
19f20 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
19f30 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
19f50 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
19f60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19f70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
19f80 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
19f90 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
19fa0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
19fb0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
19fc0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
19fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
19fe0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
19ff0 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
1a000 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a010 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
1a020 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
1a030 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
1a040 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
1a050 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
1a060 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
1a070 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1a080 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
1a090 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
1a0a0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
1a0b0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1a0c0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
1a0d0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a0e0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
1a0f0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
1a100 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1a110 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
1a120 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1a130 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
1a140 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
1a150 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
1a160 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
1a170 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
1a180 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
1a190 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1a1a0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
1a1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a1c0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
1a1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a1e0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
1a1f0 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
1a200 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
1a210 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
1a220 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1a230 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
1a240 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
1a250 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1a260 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
1a270 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
1a280 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
1a290 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
1a2a0 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
1a2b0 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
1a2c0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
1a2d0 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
1a2e0 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
1a2f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a310 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
1a320 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
1a330 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
1a340 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
1a350 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1a360 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
1a370 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
1a380 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
1a390 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
1a3a0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
1a3b0 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
1a3c0 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
1a3d0 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
1a3e0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1a3f0 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
1a400 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
1a410 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
1a420 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
1a430 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
1a440 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1a450 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1a460 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1a470 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66           pIdxInf
1a480 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
1a490 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1a4a0 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
1a4b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a4c0 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f  }.    if( i>=nCo
1a4d0 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1a4e0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1a4f0 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20   mxTerm+1;.     
1a500 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1a510 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
1a520 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
1a530 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
1a540 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1a550 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Num;.      pNew-
1a560 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1a570 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1a580 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1a590 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
1a5a0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1a5b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
1a5c0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
1a5d0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
1a5e0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  r;.      pNew->u
1a5f0 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1a600 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d  = (i8)(pIdxInfo-
1a610 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a620 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66           pIdxInf
1a650 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29  o->nOrderBy : 0)
1a660 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1a670 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1a680 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1a690 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f  ite3LogEstFromDo
1a6a0 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65  uble(pIdxInfo->e
1a6b0 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
1a6c0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1a6d0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1a6e0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1a6f0 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 20 20 20  tedRows);..     
1a700 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48 45 52   /* Set the WHER
1a710 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66  E_ONEROW flag if
1a720 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
1a730 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74  ) method indicat
1a740 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ed.      ** that
1a750 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1a760 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1a770 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1a780 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 20  therwise. */.   
1a790 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
1a7a0 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49  >idxFlags & SQLI
1a7b0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1a7c0 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  IQUE ){.        
1a7d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
1a7e0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
1a7f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a800 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1a810 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1a820 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OW;.      }.    
1a830 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
1a840 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1a850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
1a860 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1a870 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
1a880 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
1a890 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
1a8a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
1a8b0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1a8c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1a8d0 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
1a8e0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
1a8f0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
1a900 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1a910 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1a920 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1a930 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1a940 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
1a950 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a960 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a970 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1a980 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
1a990 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
1a9a0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
1a9b0 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
1a9c0 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
1a9d0 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
1a9e0 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
1a9f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1aa00 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72  oopAddOr(.  Wher
1aa10 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
1aa20 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61  uilder, .  Bitma
1aa30 73 6b 20 6d 45 78 74 72 61 2c 20 0a 20 20 42 69  sk mExtra, .  Bi
1aa40 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a  tmask mUnusable.
1aa50 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1aa60 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1aa70 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65  r->pWInfo;.  Whe
1aa80 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
1aa90 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1aaa0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
1aab0 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
1aac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1aad0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
1aae0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
1aaf0 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
1ab00 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
1ab10 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65  ild;.  WhereOrSe
1ab20 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20  t sSum, sCur;.  
1ab30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ab40 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1ab50 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1ab60 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d  >pWC;.  pWCEnd =
1ab70 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
1ab80 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
1ab90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1aba0 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
1abb0 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
1abc0 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
1abd0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
1abe0 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
1abf0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
1ac00 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
1ac10 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
1ac20 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
1ac30 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
1ac40 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
1ac50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ac60 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
1ac70 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
1ac80 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
1ac90 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
1aca0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
1acb0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
1acc0 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
1acd0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1ace0 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
1acf0 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
1ad00 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
1ad10 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
1ad20 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1ad30 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
1ad40 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
1ad50 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
1ad60 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
1ad70 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
1ad80 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1ad90 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
1ada0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1adb0 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
1adc0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1add0 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20  (0x200, ("Begin 
1ade0 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
1adf0 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
1ae00 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  m));.      for(p
1ae10 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
1ae20 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
1ae30 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
1ae40 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
1ae50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1ae60 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
1ae70 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1ae80 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
1ae90 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
1aea0 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
1aeb0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
1aec0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
1aed0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
1aee0 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
1aef0 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
1af00 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
1af10 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
1af20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
1af30 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
1af40 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
1af50 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1af60 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
1af70 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
1af80 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
1af90 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
1afa0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
1afb0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
1afc0 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
1afd0 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45   0;.#ifdef WHERE
1afe0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
1aff0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1b000 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72  (0x200, ("OR-ter
1b010 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25  m %d of %p has %
1b020 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20  d subterms:\n", 
1b030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b040 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72      (int)(pOrTer
1b050 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65  m-pOrWC->a), pTe
1b060 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57  rm, sSubBuild.pW
1b070 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20  C->nTerm));.    
1b080 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
1b090 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30  hereTrace & 0x40
1b0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
1b0b0 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75  or(i=0; i<sSubBu
1b0c0 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ild.pWC->nTerm; 
1b0d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1b0e0 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
1b0f0 28 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  (&sSubBuild.pWC-
1b100 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20  >a[i], i);.     
1b110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b120 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1b130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1b140 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
1b150 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1b160 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1b170 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1b180 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1b190 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  l(&sSubBuild, mE
1b1a0 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29  xtra, mUnusable)
1b1b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
1b1c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
1b1d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b1e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1b1f0 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  e(&sSubBuild, mE
1b200 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
1b210 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1b220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b230 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1b240 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75  reLoopAddOr(&sSu
1b250 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20  bBuild, mExtra, 
1b260 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1b270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1b280 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1b290 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1b2a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1b2b0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1b2c0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1b2d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1b2e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1b2f0 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1b300 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1b310 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1b320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1b330 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1b340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b350 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1b360 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1b370 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1b380 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1b390 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1b3a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1b3b0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1b3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1b3d0 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1b3e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1b3f0 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1b400 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1b410 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1b420 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b450 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1b460 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1b470 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b4a0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1b4b0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1b4c0 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1b4d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b4f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b500 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1b510 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1b520 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1b530 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1b540 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1b550 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1b560 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1b570 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1b580 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1b590 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1b5a0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1b5b0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1b5c0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1b5d0 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1b5e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1b5f0 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1b600 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1b610 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1b620 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1b630 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1b640 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1b650 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1b660 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1b670 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1b680 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1b690 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1b6a0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1b6b0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1b6c0 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1b6d0 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1b6e0 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1b6f0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1b700 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1b710 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1b720 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1b730 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1b740 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1b750 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1b760 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1b770 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1b780 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1b790 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1b7a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1b7b0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1b7c0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1b7d0 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1b7e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1b7f0 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1b800 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1b810 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1b820 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1b830 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1b840 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1b850 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1b860 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1b870 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1b880 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1b890 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1b8a0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1b8b0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1b8c0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1b8d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1b8e0 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
1b8f0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
1b900 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
1b910 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
1b920 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1b930 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1b940 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1b950 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
1b960 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
1b970 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
1b980 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1b990 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
1b9a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b9b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1b9c0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1b9d0 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
1b9e0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1b9f0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
1ba00 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1ba10 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
1ba20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1ba30 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1ba40 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
1ba50 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74  Extra = 0;.  Bit
1ba60 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
1ba70 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
1ba80 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1ba90 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1baa0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1bab0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1bac0 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  m;.  struct SrcL
1bad0 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d  ist_item *pEnd =
1bae0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57   &pTabList->a[pW
1baf0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  Info->nLevel];. 
1bb00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bb10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1bb20 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
1bb30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65  LITE_OK;.  Where
1bb40 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38  Loop *pNew;.  u8
1bb50 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1bb60 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   0;..  /* Loop o
1bb70 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
1bb80 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
1bb90 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
1bba0 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
1bbb0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
1bbc0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
1bbd0 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
1bbe0 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
1bbf0 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69  a; pItem<pEnd; i
1bc00 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
1bc10 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  .    Bitmask mUn
1bc20 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1bc30 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
1bc40 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
1bc50 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57  kSelf = sqlite3W
1bc60 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1bc70 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1bc80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1bc90 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
1bca0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  >fg.jointype|pri
1bcb0 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a  orJointype) & (J
1bcc0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1bcd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
1bce0 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
1bcf0 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74  is true when pIt
1bd00 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63  em is the FROM c
1bd10 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68  lause term on th
1bd20 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74  e.      ** right
1bd30 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20  -hand-side of a 
1bd40 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1bd50 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 45  IN.  */.      mE
1bd60 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  xtra = mPrior;. 
1bd70 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
1bd80 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  intype = pItem->
1bd90 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
1bda0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1bdb0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1bdc0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1bdd0 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20  ist_item *p;.   
1bde0 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b     for(p=&pItem[
1bdf0 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  1]; p<pEnd; p++)
1be00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55  {.        if( mU
1be10 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66  nusable || (p->f
1be20 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  g.jointype & (JT
1be30 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1be40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55   ){.          mU
1be50 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74  nusable |= sqlit
1be60 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
1be70 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
1be80 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  , p->iCursor);. 
1be90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bea0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1beb0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
1bec0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1bed0 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1bee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1bef0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1bf00 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
1bf10 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
1bf20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bf30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1bf40 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
1bf50 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  r(pBuilder, mExt
1bf60 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  ra, mUnusable);.
1bf70 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
1bf80 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
1bf90 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
1bfa0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1bfb0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
1bfc0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1bfd0 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1bfe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bff0 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1c000 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1c010 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1c020 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1c030 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
1c040 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1c050 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1c060 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1c070 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
1c080 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
1c090 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
1c0a0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
1c0b0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
1c0c0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
1c0d0 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
1c0e0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1c0f0 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1c100 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
1c110 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
1c120 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c130 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1c140 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
1c150 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
1c160 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
1c170 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
1c180 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
1c190 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
1c1a0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
1c1b0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
1c1c0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
1c1d0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
1c1e0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
1c1f0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
1c200 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
1c210 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
1c220 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
1c230 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
1c240 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
1c250 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
1c260 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
1c270 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
1c280 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
1c290 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
1c2a0 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
1c2b0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
1c2c0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
1c2d0 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
1c2e0 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
1c2f0 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
1c300 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
1c310 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
1c320 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
1c330 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
1c340 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
1c350 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
1c360 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
1c370 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
1c380 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1c390 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
1c3a0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
1c3b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1c3c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
1c3d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c3e0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1c3f0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
1c400 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
1c410 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1c420 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
1c430 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
1c440 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
1c450 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
1c460 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1c470 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
1c480 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
1c490 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
1c4a0 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
1c4b0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
1c4c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c4d0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
1c4e0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
1c4f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
1c500 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
1c510 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
1c520 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
1c530 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1c540 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
1c550 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
1c560 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
1c570 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
1c580 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
1c590 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
1c5a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c5b0 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
1c5c0 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1c5e0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
1c5f0 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
1c600 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c610 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
1c620 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
1c630 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
1c640 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
1c650 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
1c660 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
1c670 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
1c680 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1c690 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
1c6a0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
1c6b0 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
1c6c0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
1c6d0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
1c6e0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
1c6f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c700 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
1c710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c720 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
1c730 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
1c740 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
1c750 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1c760 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
1c770 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
1c780 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
1c790 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1c7a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
1c7b0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1c7c0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1c7d0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
1c7e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c7f0 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
1c800 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
1c810 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
1c820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c830 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1c840 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
1c850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1c860 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
1c870 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
1c880 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1c890 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
1c8a0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
1c8b0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
1c8c0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1c8d0 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
1c8e0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
1c8f0 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
1c900 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
1c910 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
1c920 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
1c930 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1c940 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
1c950 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
1c960 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
1c970 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
1c980 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
1c990 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
1c9a0 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
1c9b0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
1c9c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1c9d0 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
1c9e0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
1c9f0 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
1ca00 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
1ca10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ca20 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
1ca30 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
1ca40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ca50 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
1ca60 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
1ca70 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
1ca80 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
1ca90 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
1caa0 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
1cab0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
1cac0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
1cad0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
1cae0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
1caf0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
1cb00 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
1cb10 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
1cb20 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
1cb30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
1cb40 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
1cb50 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
1cb60 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
1cb70 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
1cb80 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
1cb90 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
1cba0 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
1cbb0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
1cbc0 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
1cbd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1cbe0 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
1cbf0 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
1cc00 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
1cc10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
1cc20 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
1cc30 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
1cc40 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
1cc50 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
1cc60 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
1cc70 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
1cc80 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
1cc90 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
1cca0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
1ccb0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
1ccc0 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
1ccd0 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
1cce0 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
1ccf0 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
1cd00 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
1cd10 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
1cd20 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
1cd30 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
1cd40 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
1cd50 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1cd60 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
1cd70 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
1cd80 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
1cd90 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
1cda0 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
1cdb0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
1cdc0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
1cdd0 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
1cde0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
1cdf0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1ce00 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
1ce10 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
1ce20 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
1ce30 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
1ce40 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
1ce50 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
1ce60 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
1ce70 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
1ce80 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
1ce90 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
1cea0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
1ceb0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1cec0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
1ced0 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
1cee0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
1cef0 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
1cf00 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
1cf10 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
1cf20 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
1cf30 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
1cf40 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
1cf50 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
1cf60 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1cf70 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
1cf80 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
1cf90 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
1cfa0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
1cfb0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
1cfc0 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
1cfd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
1cfe0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1cff0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
1d000 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69  rderBy!=0 );.  i
1d010 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
1d020 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d030 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
1d040 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
1d050 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
1d060 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
1d070 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
1d080 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
1d090 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
1d0a0 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
1d0b0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
1d0c0 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
1d0d0 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
1d0e0 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
1d0f0 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
1d100 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
1d110 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
1d120 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
1d130 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
1d140 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
1d150 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d160 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
1d170 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
1d180 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
1d190 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
1d1a0 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
1d1b0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
1d1c0 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
1d1d0 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
1d1e0 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
1d1f0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1d200 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1d210 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
1d220 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
1d230 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1d240 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65  ) obSat = obDone
1d250 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d260 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
1d270 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d280 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
1d290 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
1d2a0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
1d2b0 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
1d2c0 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
1d2d0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
1d2e0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
1d2f0 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
1d300 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
1d310 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
1d320 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
1d330 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
1d340 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
1d350 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
1d360 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
1d370 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1d380 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
1d390 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1d3a0 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
1d3b0 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
1d3c0 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
1d3d0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1d3e0 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
1d3f0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1d400 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d410 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
1d420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d430 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
1d440 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
1d450 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
1d460 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
1d470 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
1d480 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
1d490 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4b0 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
1d4c0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
1d4d0 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  _IS, 0);.      i
1d4e0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
1d4f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1d500 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d510 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
1d520 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  ))!=0 && pOBExpr
1d530 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
1d540 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1d550 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
1d560 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1d570 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1d580 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1d590 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1d5a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d5b0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d5c0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d5d0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
1d5e0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d5f0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1d600 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1d610 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1d620 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
1d630 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1d640 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1d650 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1d660 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
1d670 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
1d680 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1d690 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
1d6a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d6b0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1d6c0 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1d6d0 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
1d6e0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1d6f0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
1d700 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1d710 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d720 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
1d730 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1d740 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1d750 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
1d760 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
1d770 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
1d780 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
1d790 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
1d7a0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
1d7b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1d7c0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
1d7d0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
1d7e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d7f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1d800 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
1d810 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
1d820 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
1d830 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
1d840 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
1d850 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
1d860 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
1d870 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
1d880 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
1d890 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
1d8a0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
1d8b0 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
1d8e0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
1d8f0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
1d900 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1d910 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
1d920 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
1d930 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
1d940 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
1d950 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1d960 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
1d970 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
1d980 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
1d990 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
1d9a0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
1d9b0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
1d9c0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
1d9d0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
1d9e0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
1d9f0 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
1da00 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
1da10 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
1da20 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
1da30 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
1da40 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
1da50 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
1da60 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
1da70 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
1da80 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1da90 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f  .         && pLo
1daa0 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  op->nSkip==0.   
1dab0 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
1dac0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
1dad0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
1dae0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1daf0 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20  O_IS))!=0.      
1db00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1db10 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  f( i & WO_ISNULL
1db20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1db30 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
1db40 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  rDistinct );.   
1db50 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
1db60 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1db70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
1db90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1dba0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f     /* Get the co
1dbb0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74  lumn number in t
1dbc0 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d  he table (iColum
1dbd0 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65  n) and sort orde
1dbe0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65  r.        ** (re
1dbf0 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d  vIdx) for the j-
1dc00 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
1dc10 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1dc20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1dc30 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
1dc40 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
1dc50 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
1dc60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
1dc70 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f  dx = pIndex->aSo
1dc80 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
1dc90 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1dca0 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  n==pIndex->pTabl
1dcb0 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75  e->iPKey ) iColu
1dcc0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
1dcd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dce0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52    iColumn = XN_R
1dcf0 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20  OWID;.          
1dd00 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
1dd10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1dd20 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
1dd30 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
1dd40 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
1dd50 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
1dd60 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
1dd70 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
1dd80 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f  dered.        */
1dd90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
1dda0 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20  rderDistinct.   
1ddb0 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e        && iColumn
1ddc0 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  >=0.         && 
1ddd0 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
1dde0 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
1ddf0 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  & pIndex->pTable
1de00 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
1de10 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
1de20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1de30 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1de40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1de50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20          /* Find 
1de60 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
1de70 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  m that correspon
1de80 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63  ds to the j-th c
1de90 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a  olumn.        **
1dea0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1deb0 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
1dec0 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
1ded0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dee0 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
1def0 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
1df00 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1df10 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
1df20 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
1df30 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
1df40 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
1df50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1df60 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
1df70 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1df80 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
1df90 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1dfa0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1dfb0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1dfc0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
1dfd0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1dfe0 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
1dff0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
1e000 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1e010 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
1e020 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
1e030 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
1e040 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
1e050 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e060 69 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b  iColumn>=(-1) ){
1e070 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e080 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1e090 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1e0a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e0b0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
1e0c0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
1e0d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e0e0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
1e0f0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
1e100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e120 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1e130 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1e140 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d 3e  pOBExpr,pIndex->
1e150 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
1e160 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20 20  Expr,iCur) ){.  
1e170 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1e180 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1e1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1e1b0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
1e1c0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1e1d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1e1e0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
1e1f0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
1e200 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1e210 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1e220 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1e230 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1e240 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e250 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1e260 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
1e270 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
1e280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1e2a0 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
1e2b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e2d0 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
1e2e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1e2f0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
1e300 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
1e310 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
1e320 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
1e330 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
1e340 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
1e350 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
1e360 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
1e370 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
1e380 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
1e390 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
1e3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e3b0 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
1e3c0 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
1e3d0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
1e3e0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
1e3f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e400 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
1e410 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
1e420 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1e430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e440 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
1e450 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
1e460 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
1e470 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
1e480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e490 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1e4a0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
1e4b0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
1e4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e4d0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
1e4e0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
1e4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
1e500 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
1e510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e520 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
1e530 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1e540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e550 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
1e560 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
1e570 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
1e580 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
1e590 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1e5a0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1e5b0 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
1e5c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1e5d0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1e5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e5f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e600 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
1e610 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1e620 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
1e630 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
1e640 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
1e650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1e660 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
1e670 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
1e680 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
1e690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1e6a0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
1e6b0 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
1e6c0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
1e6d0 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
1e6e0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
1e6f0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
1e700 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
1e710 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
1e720 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
1e730 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1e740 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1e750 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1e760 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1e770 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
1e780 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
1e790 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1e7a0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1e7b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
1e7c0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
1e7d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1e7e0 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
1e7f0 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
1e800 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1e810 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1e820 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
1e830 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1e840 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
1e850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
1e860 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
1e870 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
1e880 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
1e890 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
1e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e8b0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
1e8c0 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
1e8d0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
1e8e0 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
1e8f0 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
1e900 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
1e910 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
1e920 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
1e930 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
1e940 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
1e950 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
1e960 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1e970 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
1e980 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
1e990 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
1e9a0 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
1e9b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1e9c0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1e9d0 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
1e9e0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
1e9f0 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
1ea00 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
1ea10 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1ea20 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
1ea30 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
1ea40 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
1ea50 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
1ea60 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
1ea70 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
1ea80 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
1ea90 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
1eaa0 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
1eab0 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
1eac0 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
1ead0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
1eae0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1eaf0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1eb00 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
1eb10 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
1eb20 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
1eb30 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
1eb40 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
1eb50 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
1eb60 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
1eb70 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
1eb80 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
1eb90 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
1eba0 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
1ebb0 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
1ebc0 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
1ebd0 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
1ebe0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ebf0 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
1ec00 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1ec10 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
1ec20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
1ec30 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
1ec40 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
1ec50 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
1ec60 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
1ec70 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
1ec80 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
1ec90 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1eca0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1ecb0 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
1ecc0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1ecd0 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
1ece0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
1ecf0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1ed00 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
1ed10 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
1ed20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
1ed30 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
1ed40 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1ed50 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
1ed60 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
1ed70 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
1ed80 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
1ed90 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
1eda0 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
1edb0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1edc0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
1edd0 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
1ede0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1edf0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
1ee00 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
1ee10 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
1ee20 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
1ee30 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1ee40 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
1ee50 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
1ee60 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1ee70 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
1ee80 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
1ee90 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
1eea0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
1eeb0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
1eec0 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
1eed0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1eee0 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
1eef0 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
1ef00 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
1ef10 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
1ef20 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
1ef30 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
1ef40 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1ef50 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
1ef60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ef70 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
1ef80 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
1ef90 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
1efa0 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
1efb0 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
1efc0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1efd0 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
1efe0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
1eff0 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
1f000 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
1f010 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
1f020 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1f030 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
1f040 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
1f050 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
1f060 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
1f070 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1f080 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
1f090 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
1f0a0 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
1f0b0 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
1f0c0 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
1f0d0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
1f0e0 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
1f0f0 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
1f100 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
1f110 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
1f120 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
1f130 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
1f140 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
1f150 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
1f160 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
1f170 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
1f180 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
1f190 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1f1a0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1f1b0 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
1f1c0 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
1f1d0 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
1f1e0 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
1f1f0 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
1f200 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
1f210 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
1f220 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
1f230 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
1f240 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
1f250 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
1f260 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
1f270 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
1f280 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
1f290 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
1f2a0 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
1f2b0 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
1f2c0 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c  /* Multiple by l
1f2d0 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73  og(M) where M is
1f2e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
1f2f0 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a  utput rows..  **
1f300 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66   Use the LIMIT f
1f310 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d  or M if it is sm
1f320 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  aller */.  if( (
1f330 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1f340 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
1f350 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e  IMIT)!=0 && pWIn
1f360 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20  fo->iLimit<nRow 
1f370 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57  ){.    nRow = pW
1f380 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  Info->iLimit;.  
1f390 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d  }.  rSortCost +=
1f3a0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20   estLog(nRow);. 
1f3b0 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73   return rSortCos
1f3c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t;.}../*.** Give
1f3d0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
1f3e0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1f3f0 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
1f400 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
1f410 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
1f420 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
1f430 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
1f440 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
1f450 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
1f460 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
1f470 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
1f480 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
1f490 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
1f4a0 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
1f4b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1f4c0 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
1f4d0 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
1f4e0 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
1f4f0 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
1f500 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
1f510 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
1f520 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
1f530 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
1f540 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
1f550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f560 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
1f570 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
1f580 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1f590 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
1f5a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1f5b0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
1f5c0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
1f5d0 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
1f5e0 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
1f5f0 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
1f600 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
1f610 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
1f620 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
1f630 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1f660 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
1f670 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1f680 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1f690 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1f6a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1f6b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1f6c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1f6d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1f6e0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
1f6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1f700 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
1f710 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1f720 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
1f730 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
1f740 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f750 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
1f760 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
1f770 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1f780 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
1f790 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  place */.  int n
1f7a0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1f7b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f7c0 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
1f7d0 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67  e terms */.  Log
1f7e0 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  Est mxCost = 0; 
1f7f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1f800 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  m cost of a set 
1f810 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
1f820 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20  gEst mxUnsorted 
1f830 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d  = 0;    /* Maxim
1f840 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74  um unsorted cost
1f850 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
1f860 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  h */.  int nTo, 
1f870 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
1f880 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
1f890 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
1f8a0 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
1f8b0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1f8c0 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
1f8d0 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
1f8e0 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
1f8f0 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
1f900 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
1f910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f920 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
1f930 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
1f940 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
1f950 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
1f960 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1f970 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
1f980 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
1f990 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
1f9a0 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
1f9b0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
1f9c0 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
1f9d0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
1f9e0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1f9f0 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
1fa00 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
1fa10 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
1fa20 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
1fa30 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
1fa40 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
1fa50 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
1fa60 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61  y */.  LogEst *a
1fa70 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20  SortCost = 0;   
1fa80 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20   /* Sorting and 
1fa90 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20  partial sorting 
1faa0 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  costs */.  char 
1fab0 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
1fac0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1fad0 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
1fae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
1faf0 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20  .  int nSpace;  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb10 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  Bytes of space a
1fb20 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61  llocated at pSpa
1fb30 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ce */..  pParse 
1fb40 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1fb50 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1fb60 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
1fb70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
1fb80 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
1fb90 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
1fba0 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
1fbb0 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
1fbc0 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
1fbd0 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
1fbe0 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
1fbf0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
1fc00 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
1fc10 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
1fc20 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
1fc30 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
1fc40 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a  (nLoop<=1) ? 1 :
1fc50 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
1fc60 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
1fc70 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
1fc80 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
1fc90 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1fca0 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
1fcb0 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77  n solver.  (nRow
1fcc0 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77  Est=%d)\n", nRow
1fcd0 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Est));..  /* If 
1fce0 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20  nRowEst is zero 
1fcf0 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
1fd00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1fd10 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74   ignore it. In t
1fd20 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  his.  ** case th
1fd30 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  e purpose of thi
1fd40 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74  s call is to est
1fd50 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1fd60 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
1fd70 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76  d.  ** by the ov
1fd80 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63  erall query. Onc
1fd90 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20  e this estimate 
1fda0 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1fdb0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  d, the caller.  
1fdc0 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ** will invoke t
1fdd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73  his function a s
1fde0 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73  econd time, pass
1fdf0 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65  ing the estimate
1fe00 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f   as the.  ** nRo
1fe10 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  wEst parameter. 
1fe20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1fe30 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
1fe40 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
1fe50 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
1fe60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
1fe70 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d  rderBy = pWInfo-
1fe80 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1fe90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
1fea0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1feb0 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
1fec0 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f  o, aFrom and aSo
1fed0 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53  rtCost[] */.  nS
1fee0 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57  pace = (sizeof(W
1fef0 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
1ff00 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
1ff10 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
1ff20 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65    nSpace += size
1ff30 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
1ff40 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20  derBy;.  pSpace 
1ff50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ff60 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63  cRawNN(db, nSpac
1ff70 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
1ff80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1ff90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1ffa0 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
1ffb0 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
1ffc0 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
1ffd0 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
1ffe0 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
1fff0 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
20000 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
20010 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
20020 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
20030 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
20040 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
20050 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
20060 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
20070 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
20080 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
20090 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
200a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
200b0 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
200c0 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
200d0 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
200e0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
200f0 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
20100 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
20110 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
20120 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
20130 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
20140 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
20150 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
20160 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
20170 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
20180 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
20190 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
201a0 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
201b0 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
201c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
201d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
201e0 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
201f0 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
20200 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
20210 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
20220 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
20230 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
20240 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
20250 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
20260 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
20270 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
20280 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
20290 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
202a0 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
202b0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
202c0 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
202d0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
202e0 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
202f0 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
20300 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
20310 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
20320 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
20330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
20340 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
20350 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
20360 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
20370 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
20380 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
20390 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
203a0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
203b0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
203c0 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
203d0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
203e0 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
203f0 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
20400 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
20410 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
20420 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
20430 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
20440 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
20450 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
20460 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
20470 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
20480 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
20490 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
204a0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
204b0 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
204c0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
204d0 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
204e0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
204f0 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
20500 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
20510 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
20520 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
20530 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
20540 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
20550 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
20560 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
20570 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
20580 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
20590 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
205a0 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
205b0 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
205c0 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
205d0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
205e0 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
205f0 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
20600 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
20610 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
20620 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
20630 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
20640 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
20650 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
20660 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
20670 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
20680 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
20690 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
206a0 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
206b0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
206c0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
206d0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
206e0 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
206f0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
20700 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
20710 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
20720 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
20730 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
20740 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
20750 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
20760 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
20770 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
20780 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
20790 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
207a0 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
207b0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
207c0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
207d0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
207e0 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
20810 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
20820 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
20830 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
20860 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
20870 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
20880 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
208a0 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
208b0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
208c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
208d0 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
208e0 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
208f0 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
20900 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
20910 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
20920 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
20930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20940 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
20950 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
20960 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
20970 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
20980 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20990 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
209a0 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
209b0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
209c0 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
209d0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
209e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
209f0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
20a00 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
20a10 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
20a20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20a30 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
20a40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20a50 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
20a60 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c   && pFrom->nRow<
20a70 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  10 ){.          
20a80 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e  /* Do not use an
20a90 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
20aa0 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f   if the this loo
20ab0 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20  p is expected.  
20ac0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75          ** to ru
20ad0 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69  n less than 2 ti
20ae0 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  mes. */.        
20af0 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
20b00 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
20b10 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
20b20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
20b30 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
20b40 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
20b50 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
20b60 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
20b70 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
20b80 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
20b90 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
20ba0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
20bb0 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
20bc0 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
20bd0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
20be0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
20bf0 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
20c00 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
20c10 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
20c20 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
20c30 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
20c40 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
20c50 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
20c60 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
20c70 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
20c80 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
20c90 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
20ca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
20cb0 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
20cc0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
20cd0 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
20d00 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
20d10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
20d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d30 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
20d40 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
20d50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20d60 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
20d70 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
20d80 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
20d90 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
20da0 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
20db0 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
20dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
20dd0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
20de0 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
20df0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
20e00 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
20e10 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20e30 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
20e40 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
20e50 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
20e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20e70 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
20e80 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20e90 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f  d(rUnsorted, aSo
20ea0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20eb0 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57  ]);..          W
20ec0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
20ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
20ee0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
20ef0 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63  %-3d (%d/%d) inc
20f00 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20  reases cost %3d 
20f10 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20  to %-3d\n",.    
20f20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
20f30 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c  Cost[isOrdered],
20f40 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64   (nOrderBy-isOrd
20f50 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c  ered), nOrderBy,
20f60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20f70 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73   rUnsorted, rCos
20f80 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t));.        }el
20f90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43  se{.          rC
20fa0 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ost = rUnsorted;
20fb0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20fc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
20fd0 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
20fe0 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
20ff0 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20   the set of.    
21000 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20      ** mxChoice 
21010 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
21020 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s..        **.  
21030 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c        ** First l
21040 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
21050 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62  ing path among b
21060 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
21070 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
21080 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65   covers the same
21090 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
210a0 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69  d has the same i
210b0 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
210c0 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74   ** setting as t
210d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20  he current path 
210e0 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20  candidate..     
210f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
21100 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f   The term "((pTo
21110 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
21120 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22  dered)&0x80)==0"
21130 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20   is equivalent. 
21140 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54         ** to (pT
21150 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  o->isOrdered==(-
21160 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d  1))==(isOrdered=
21170 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20  =(-1))" for the 
21180 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  range.        **
21190 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73   of legal values
211a0 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20   for isOrdered, 
211b0 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20  -1..64..        
211c0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
211d0 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
211e0 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
211f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
21200 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
21210 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20  =maskNew.       
21220 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73      && ((pTo->is
21230 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
21240 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20  d)&0x80)==0.    
21250 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21260 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
21270 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
21280 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
212a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
212b0 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
212c0 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66        /* None of
212d0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65   the existing be
212e0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20  st-so-far paths 
212f0 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64  match the candid
21300 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
21310 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
21320 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ice.           &
21330 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  & (rCost>mxCost 
21340 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  || (rCost==mxCos
21350 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d  t && rUnsorted>=
21360 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20  mxUnsorted)).   
21370 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
21390 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69  rent candidate i
213a0 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e  s no better than
213b0 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68   any of the mxCh
213c0 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
213d0 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e   ** paths curren
213e0 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d  tly in the best-
213f0 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20  so-far buffer.  
21400 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20  So discard.     
21410 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
21420 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20  andidate as not 
21430 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65  viable. */.#ifde
21440 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
21450 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
21460 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
21470 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21480 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
21490 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
214a0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
214b0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
214c0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
214f0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
21500 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
21510 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
21520 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
21530 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
21540 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21550 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21560 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
21570 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
21580 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
21590 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
215a0 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
215b0 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
215c0 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
215d0 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
215e0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
215f0 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
21600 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
21610 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
21620 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
21630 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
21640 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
21650 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
21660 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
21670 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
21680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
216a0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
216b0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
216c0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
216d0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
216e0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
216f0 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
21700 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
21710 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
21720 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21730 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21750 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21760 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21770 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21780 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
21790 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
217a0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
217b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
217c0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
217d0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
217e0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
21800 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
21810 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
21820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
21830 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
21840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
21850 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
21860 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73  s here if best-s
21870 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61  o-far path pTo=a
21880 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68  To[jj] covers th
21890 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
218a0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
218b0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
218c0 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
218d0 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
218e0 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
218f0 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
21900 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
21910 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
21920 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
21930 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
21940 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
21950 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20   be skipped */. 
21960 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
21970 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c  ->rCost<rCost ||
21980 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43   (pTo->rCost==rC
21990 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
219a0 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65  <=nOut) ){.#ifde
219b0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
219c0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
219d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
219e0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
219f0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
21a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
21a10 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
21a20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
21a30 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
21a40 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
21a70 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
21a80 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
21a90 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
21aa0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
21ab0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
21ac0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
21ad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21ae0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
21af0 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  vs %s cost=%-3d,
21b00 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  %d order=%c\n",.
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
21b30 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
21b40 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
21b50 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
21b60 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
21b70 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
21b80 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
21b90 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21ba0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
21bc0 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64  scard the candid
21bd0 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75  ate path from fu
21be0 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
21bf0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
21c00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
21c10 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
21c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
21c30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21c40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
21c50 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
21c60 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
21c70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
21c80 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
21c90 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
21ca0 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72  e path is better
21cb0 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
21cc0 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e      ** pTo path.
21cd0 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69    Replace pTo wi
21ce0 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  th the candidate
21cf0 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
21d00 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
21d10 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
21d20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
21d30 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
21d40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21d50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
21d80 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21d90 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
21da0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
21db0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
21dc0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
21dd0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
21de0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
21df0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
21e00 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
21e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
21e20 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
21e30 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
21e40 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
21e60 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
21e70 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
21e80 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
21e90 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
21ea0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
21eb0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
21ec0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
21ed0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
21ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
21ef0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
21f00 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
21f10 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
21f20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
21f30 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
21f40 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
21f50 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
21f60 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
21f70 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
21f80 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
21f90 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
21fa0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
21fb0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
21fc0 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
21fd0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
21fe0 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
21ff0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
22000 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
22010 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
22020 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
22030 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
22040 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
22050 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
22060 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
22070 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
22080 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
22090 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
220a0 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
220b0 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
220c0 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
220d0 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
220e0 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
220f0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
22100 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
22110 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
22120 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
22130 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
22140 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
22150 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
22160 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
22170 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
22180 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
22190 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
221b0 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
221c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
221d0 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
221e0 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
221f0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
22200 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
22210 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
22220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22230 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
22240 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
22250 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
22260 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
22270 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
22280 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22290 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
222a0 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
222b0 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
222c0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
222d0 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
222e0 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
222f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22300 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
22310 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
22320 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
22330 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
22340 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
22350 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
22360 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
22370 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
22380 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
22390 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
223a0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
223b0 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
223c0 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
223d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
223e0 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
223f0 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
22400 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
22410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22420 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22430 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
22440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22450 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
22460 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
22470 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
22480 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
22490 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
224a0 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
224b0 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
224c0 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
224d0 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
224e0 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
224f0 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
22500 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22510 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
22520 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
22530 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22540 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
22550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22560 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
22570 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
22580 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
22590 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
225a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
225b0 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
225c0 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69  = aFrom;.  for(i
225d0 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
225e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
225f0 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
22600 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
22610 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
22620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22630 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
22640 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
22650 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
22660 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
22670 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
22680 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
22690 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
226a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
226b0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
226c0 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
226d0 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
226e0 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
226f0 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
22700 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
22710 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
22720 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
22730 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
22740 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
22750 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
22760 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
22770 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22780 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
22790 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
227a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
227b0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
227c0 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
227d0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
227e0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
227f0 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
22800 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
22810 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
22820 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
22830 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
22840 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
22850 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
22860 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
22870 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
22880 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
22890 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
228a0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
228b0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
228c0 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74  =pWInfo->pResult
228d0 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
228e0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
228f0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
22900 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
22910 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22920 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
22930 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
22940 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22950 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
22960 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
22970 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
22980 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
22990 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
229a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
229b0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
229c0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
229d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
229e0 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
229f0 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
22a00 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
22a10 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
22a20 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d  BSat<0 ) pWInfo-
22a30 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
22a40 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
22a50 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
22a60 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oop;.    }.    i
22a70 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
22a80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
22a90 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
22aa0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
22ab0 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
22ac0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
22ad0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
22ae0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
22af0 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
22b00 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
22b10 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
22b20 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
22b30 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
22b40 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
22b50 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
22b60 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
22b70 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
22b80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
22b90 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
22ba0 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
22bb0 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
22bc0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
22bd0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
22be0 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
22bf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
22c00 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
22c10 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
22c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
22c30 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
22c40 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
22c50 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
22c60 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
22c70 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
22c80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22c90 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
22ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
22cc0 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
22cd0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
22ce0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
22cf0 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
22d00 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
22d10 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
22d20 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
22d30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
22d40 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
22d50 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
22d60 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
22d70 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
22d80 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
22d90 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
22da0 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
22db0 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
22dc0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
22dd0 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
22de0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
22df0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
22e00 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
22e10 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
22e20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
22e30 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
22e40 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
22e50 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
22e60 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
22e70 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
22e80 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
22e90 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
22ea0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
22eb0 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
22ec0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
22ed0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
22ee0 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
22ef0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22f00 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
22f10 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
22f20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
22f30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
22f40 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
22f50 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
22f60 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
22f70 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66  pIdx;.  .  pWInf
22f80 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
22f90 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
22fa0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22fb0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
22fc0 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
22fd0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
22fe0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
22ff0 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
23000 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
23010 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
23020 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
23030 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
23040 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23050 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
23060 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72  ndexedBy ) retur
23070 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
23080 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
23090 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
230a0 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
230b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
230c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
230d0 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b   0;.  pLoop->nSk
230e0 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  ip = 0;.  pTerm 
230f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
23100 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
23110 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57  , -1, 0, WO_EQ|W
23120 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_IS, 0);.  if( 
23130 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73  pTerm ){.    tes
23140 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
23150 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
23160 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
23170 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
23180 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
23190 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
231a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
231b0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
231c0 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
231d0 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
231e0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
231f0 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
23200 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
23210 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
23220 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
23230 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71  = 33;  /* 33==sq
23240 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
23250 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
23260 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23270 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
23280 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
23290 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b        int opMask
232a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
232b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
232c0 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
232d0 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  m );.      if( !
232e0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
232f0 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  dx).       || pI
23300 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
23310 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
23320 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
23330 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
23340 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
23350 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
23360 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49       opMask = pI
23370 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
23380 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  ? (WO_EQ|WO_IS) 
23390 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66  : WO_EQ;.      f
233a0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
233b0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
233c0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73         pTerm = s
233d0 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
233e0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
233f0 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64  , 0, opMask, pId
23400 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
23410 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
23420 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23430 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
23440 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
23450 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
23460 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
23470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23480 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65  if( j!=pIdx->nKe
23490 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
234a0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
234b0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
234c0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
234d0 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
234e0 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ED;.      if( pI
234f0 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c  dx->isCovering |
23500 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  | (pItem->colUse
23510 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
23520 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
23530 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
23540 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
23550 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
23560 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
23570 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
23580 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
23590 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
235a0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
235b0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
235c0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
235d0 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
235e0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
235f0 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
23600 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
23610 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 39==sqlite3Log
23620 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  Est(15) */.     
23630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23640 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
23650 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
23660 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
23670 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  Est)1;.    pWInf
23680 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
23690 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f   pLoop;.    pLoo
236a0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71  p->maskSelf = sq
236b0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
236c0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
236d0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
236e0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
236f0 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
23700 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
23710 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
23720 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
23730 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
23740 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  =  pWInfo->pOrde
23750 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
23760 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
23770 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
23780 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
23790 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
237a0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
237b0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
237c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
237d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
237e0 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b  Loop->cId = '0';
237f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
23800 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
23810 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
23820 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
23830 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
23840 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
23850 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
23860 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
23870 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
23880 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
23890 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
238a0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
238b0 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
238c0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
238d0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
238e0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
238f0 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
23900 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
23910 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
23920 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
23930 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
23940 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
23950 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
23960 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
23970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
23980 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
23990 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
239a0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
239b0 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
239c0 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
239d0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
239e0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
239f0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
23a00 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
23a10 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
23a20 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
23a30 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
23a40 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
23a50 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
23a60 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
23a70 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
23a80 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
23a90 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
23aa0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
23ab0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
23ac0 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
23ad0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
23ae0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
23af0 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
23b00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
23b10 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
23b20 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
23b30 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
23b40 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
23b50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
23b60 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
23b70 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
23b80 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
23b90 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
23ba0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
23bb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
23bc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
23bd0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
23be0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
23bf0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
23c00 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
23c20 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
23c30 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
23c40 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
23c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
23c60 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
23c70 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
23c80 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
23c90 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
23ca0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
23cb0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23cc0 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
23cd0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
23ce0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
23cf0 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
23d00 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
23d10 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
23d20 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
23d30 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
23d40 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
23d50 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
23d60 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
23d70 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
23d80 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
23d90 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
23da0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
23db0 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
23dc0 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
23dd0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
23de0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
23df0 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
23e00 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
23e10 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
23e20 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
23e30 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
23e40 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
23e50 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
23e60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
23e70 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
23e80 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
23e90 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
23ea0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
23eb0 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
23ec0 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
23ed0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
23ee0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
23ef0 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
23f00 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
23f10 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
23f20 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
23f30 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
23f40 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
23f50 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
23f60 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
23f70 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
23f80 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
23f90 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
23fa0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
23fb0 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
23fc0 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
23fd0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
23fe0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23ff0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
24000 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
24010 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
24020 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
24030 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
24040 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
24050 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
24060 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
24070 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
24080 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
24090 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
240a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
240b0 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
240c0 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
240d0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
240e0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
240f0 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
24100 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
24110 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
24120 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
24130 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
24140 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
24150 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
24160 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
24170 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
24180 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
24190 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
241a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
241b0 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
241c0 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
241d0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
241e0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
241f0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
24200 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
24210 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
24220 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
24230 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24240 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
24250 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
24260 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
24270 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
24280 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
24290 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
242a0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
242b0 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
242c0 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
242d0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
242e0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
242f0 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
24300 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
24310 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
24320 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
24330 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
24340 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
24350 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
24360 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
24370 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
24380 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
24390 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
243a0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
243b0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
243c0 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
243d0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
243e0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
243f0 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
24400 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
24410 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
24420 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
24430 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
24440 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
24450 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
24460 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
24470 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
24480 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
24490 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
244a0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
244b0 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
244c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
244d0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
244e0 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
244f0 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
24500 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
24510 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
24520 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
24530 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
24540 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
24550 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
24560 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
24570 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
24580 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
24590 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
245a0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
245b0 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
245c0 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
245d0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
245e0 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
245f0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
24600 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43  LY is set, iIdxC
24610 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
24620 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
24630 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f  dex.** to use fo
24640 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
24650 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45  essing.  The WHE
24660 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  RE clause should
24670 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65   use this.** spe
24680 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49  cific cursor.  I
24690 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  f WHERE_ONEPASS_
246a0 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20  DESIRED is set, 
246b0 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a  then iIdxCur is.
246c0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72  ** the first cur
246d0 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  sor in an array 
246e0 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  of cursors for a
246f0 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64  ll indices.  iId
24700 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  xCur should.** b
24710 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  e used to comput
24720 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
24730 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69  e cursor dependi
24740 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65  ng on which inde
24750 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f  x is.** used..*/
24760 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
24770 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
24780 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
24790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
247a0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
247b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
247c0 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20  ist,    /* FROM 
247d0 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
247e0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
247f0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
24800 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
24810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
24820 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
24830 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
24840 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
24850 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
24860 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
24870 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
24880 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
24890 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
248a0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
248b0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
248c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
248d0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
248e0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
248f0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
24900 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20  AuxArg          
24910 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
24920 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
24930 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
24940 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20  number,.        
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f  ** If WHERE_USE_
24970 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20  LIMIT, then the 
24980 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a  limit amount */.
24990 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
249a0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
249b0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
249c0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
249d0 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
249e0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a00 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
24a10 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
24a20 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
24a30 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
24a40 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
24a50 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
24a60 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
24a70 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
24a80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
24a90 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
24aa0 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
24ab0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
24ac0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
24ad0 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
24ae0 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
24af0 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
24b00 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
24b10 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
24b20 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
24b30 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
24b40 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
24b50 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
24b60 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
24b70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
24b80 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
24b90 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
24ba0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
24bb0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
24bc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
24bd0 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
24be0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
24bf0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
24c20 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
24c30 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
24c40 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
24c50 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
24c60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24c80 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38  urn code */.  u8
24c90 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b   bFordelete = 0;
24ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c           /* OPFL
24cb0 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20  AG_FORDELETE or 
24cc0 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72  zero, as appropr
24cd0 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  iate */..  asser
24ce0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
24cf0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
24d00 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28  ULTIROW)==0 || (
24d10 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c 46  .        (wctrlF
24d20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
24d30 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
24d40 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72 6c   .     && (wctrl
24d50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
24d60 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
24d70 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f  0 .  ));..  /* O
24d80 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45  nly one of WHERE
24d90 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 6f  _ONETABLE_ONLY o
24da0 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  r WHERE_USE_LIMI
24db0 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  T */.  assert( (
24dc0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24dd0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
24de0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
24df0 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20   || (wctrlFlags 
24e00 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
24e10 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56  T)==0 );..  /* V
24e20 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
24e30 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
24e40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
24e50 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
24e60 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
24e70 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
24e80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
24e90 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
24ea0 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
24eb0 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
24ec0 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
24ed0 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
24ee0 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
24ef0 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
24f00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
24f10 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
24f20 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
24f30 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
24f40 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
24f50 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
24f60 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
24f70 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
24f80 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
24f90 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
24fa0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
24fb0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
24fc0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
24fd0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
24fe0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
24ff0 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
25000 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
25010 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
25020 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
25030 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
25040 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
25050 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
25060 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
25070 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
25080 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
25090 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
250a0 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
250b0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
250c0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
250d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
250e0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
250f0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
25100 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
25110 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
25120 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
25130 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
25140 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
25150 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
25160 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
25170 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
25180 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
25190 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
251a0 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
251b0 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
251c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
251d0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
251e0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
251f0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
25200 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
25210 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
25220 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
25230 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
25240 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
25250 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
25260 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
25270 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
25280 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
25290 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
252a0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
252b0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
252c0 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
252d0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
252e0 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
252f0 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
25300 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
25310 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
25320 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
25330 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
25340 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
25350 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
25360 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
25370 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
25380 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
25390 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
253a0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
253b0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
253c0 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
253d0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
253e0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
253f0 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
25400 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
25410 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
25420 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
25430 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
25440 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
25450 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
25460 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
25470 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
25480 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
25490 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
254a0 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
254b0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
254c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
254d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
254e0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
254f0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
25500 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
25510 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
25520 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
25530 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
25540 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
25550 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
25560 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
25570 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
25580 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
25590 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
255a0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
255b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
255c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
255d0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
255e0 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
255f0 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
25600 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
25610 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
25620 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
25630 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
25640 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
25650 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
25660 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72  >iLimit = iAuxAr
25670 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  g;.  pWInfo->sav
25680 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
25690 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
256a0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  p;.  assert( pWI
256b0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
256c0 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f  NEPASS_OFF );  /
256d0 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c  * ONEPASS defaul
256e0 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70  ts to OFF */.  p
256f0 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
25700 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
25710 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
25720 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
25730 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
25740 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
25750 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
25760 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
25770 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
25780 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
25790 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
257a0 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
257b0 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
257c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
257d0 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
257e0 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
257f0 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
25800 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25810 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
25820 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
25830 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
25840 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
25850 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
25860 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
25870 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
25880 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
25890 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49  ite3WhereClauseI
258a0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
258b0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
258c0 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26  ite3WhereSplit(&
258d0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
258e0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
258f0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
25900 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
25910 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
25920 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
25930 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
25940 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
25950 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
25960 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
25970 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66  l thru..  */.  f
25980 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
25990 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
259a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62  +){.    if( nTab
259b0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
259c0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
259d0 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43  NotJoin(sWLB.pWC
259e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
259f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
25a00 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25a10 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  e, sWLB.pWC->a[i
25a20 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  i].pExpr, pWInfo
25a30 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20  ->iBreak,.      
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
25a60 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c  NULL);.      sWL
25a70 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46  B.pWC->a[ii].wtF
25a80 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
25a90 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
25aa0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
25ab0 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
25ac0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
25ad0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
25ae0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
25af0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
25b00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
25b10 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
25b20 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
25b30 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
25b40 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
25b50 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
25b60 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
25b70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
25b80 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
25b90 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
25ba0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
25bb0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
25bc0 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20  *.  ** The N-th 
25bd0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
25be0 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69 67   clause is assig
25bf0 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66  ned a bitmask of
25c00 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   1<<N..  **.  **
25c10 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65   The rule of the
25c20 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
25c30 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61 20  ce ensures thta 
25c40 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
25c50 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74  ask for.  ** a t
25c60 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
25c70 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
25c80 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
25c90 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
25ca0 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77   of T..  ** Know
25cb0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
25cc0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
25cd0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
25ce0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a  left join is.  *
25cf0 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
25d00 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
25d10 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
25d20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
25d30 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
25d40 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
25d50 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
25d60 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
25d70 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
25d80 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
25d90 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
25da0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
25db0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
25dc0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
25dd0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
25de0 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
25df0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
25e00 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
25e10 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
25e20 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
25e30 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
25e40 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
25e50 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
25e60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  );.    sqlite3Wh
25e70 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70  ereTabFuncArgs(p
25e80 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74  Parse, &pTabList
25e90 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f  ->a[ii], &pWInfo
25ea0 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64  ->sWC);.  }.#ifd
25eb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25ec0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25ed0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
25ee0 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  i++){.    Bitmas
25ef0 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  k m = sqlite3Whe
25f00 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  reGetMask(pMaskS
25f10 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
25f20 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
25f30 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53    assert( m==MAS
25f40 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a  KBIT(ii) );.  }.
25f50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
25f60 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
25f70 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
25f80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
25f90 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
25fa0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
25fb0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
25fc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
25fd0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
25fe0 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72  ror;..  if( wctr
25ff0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
26000 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
26010 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
26020 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
26030 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
26040 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
26050 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
26060 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
26070 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
26080 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
26090 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
260a0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
260b0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
260c0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
260d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
260e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
260f0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
26100 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
26110 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
26120 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
26130 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
26140 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
26150 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
26160 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
26170 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
26180 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
26190 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
261a0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
261b0 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
261c0 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
261d0 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71  NABLED).  if( sq
261e0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
261f0 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  & 0xffff ){.    
26200 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26210 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  tf("*** Optimize
26220 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74  r Start *** (wct
26230 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77  rlFlags: 0x%x",w
26240 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
26250 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
26260 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
26270 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26280 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
26290 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78  limit: %d", iAux
262a0 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
262b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
262c0 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20  tf(")\n");.  }. 
262d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
262e0 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
262f0 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
26300 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
26310 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
26320 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
26330 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43  (i=0; i<sWLB.pWC
26340 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
26350 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
26360 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61  int(&sWLB.pWC->a
26370 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
26380 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
26390 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
263a0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
263b0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
263c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
263d0 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
263e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
263f0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
26400 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
26410 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
26420 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
26430 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
26440 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
26450 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
26460 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
26470 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
26480 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
26490 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
264a0 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
264b0 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
264c0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
264d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26500 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
26510 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
26520 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
26530 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
26540 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
26550 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
26560 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
26570 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
26580 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
26590 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
265a0 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
265b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
265c0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
265d0 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
265e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
265f0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
26600 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
26610 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
26620 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
26630 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
26640 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
26650 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
26660 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
26670 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
26680 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
26690 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
266a0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
266b0 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
266c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
266d0 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
266e0 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
266f0 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
26700 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
26710 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
26720 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
26730 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
26740 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
26750 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
26760 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26770 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
26780 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
26790 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
267a0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
267b0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
267c0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
267d0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
267e0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
267f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26800 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
26810 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
26820 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
26830 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
26840 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
26850 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
26860 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
26870 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
26880 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
26890 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
268a0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
268b0 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
268c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
268d0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
268e0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
268f0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
26900 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26910 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
26920 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
26930 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26940 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
26950 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
26960 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
26970 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26980 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
26990 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
269a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
269b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
269c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
269d0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
269e0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
269f0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
26a00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26a10 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
26a20 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
26a30 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
26a40 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
26a50 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
26a60 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
26a70 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
26a80 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
26a90 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
26aa0 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
26ab0 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
26ac0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
26ad0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
26ae0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
26af0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
26b00 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
26b10 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
26b20 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
26b30 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
26b40 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
26b50 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
26b60 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
26b70 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
26b80 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
26b90 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
26ba0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
26bb0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
26bc0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
26bd0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
26be0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
26bf0 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
26c00 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
26c10 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
26c20 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
26c30 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
26c40 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
26c50 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
26c60 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
26c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
26c80 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
26c90 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
26ca0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26cb0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
26cc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
26cd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26ce0 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
26cf0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
26d00 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
26d10 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
26d20 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
26d30 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
26d40 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
26d50 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
26d60 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
26d70 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
26d80 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
26d90 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
26da0 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
26db0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
26dc0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
26dd0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
26de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
26df0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
26e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26e10 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
26e20 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
26e30 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
26e40 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
26e50 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
26e60 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
26e70 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
26e80 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
26e90 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
26ea0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
26eb0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
26ec0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
26ed0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
26ee0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
26ef0 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
26f00 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
26f10 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
26f20 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
26f30 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
26f40 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
26f50 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
26f60 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
26f70 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
26f80 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
26f90 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
26fa0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
26fb0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
26fc0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
26fd0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
26fe0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
26ff0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
27000 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
27010 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
27020 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
27030 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
27040 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
27050 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
27060 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
27070 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f  ;.    if( bOnero
27080 77 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72  w.     || ((wctr
27090 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
270a0 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
270b0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
270c0 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20  & 0==(wsFlags & 
270d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
270e0 4c 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  LE)).    ){.    
270f0 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61    pWInfo->eOnePa
27100 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f  ss = bOnerow ? O
27110 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20  NEPASS_SINGLE : 
27120 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20  ONEPASS_MULTI;. 
27130 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
27140 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
27150 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61  .pTab) && (wsFla
27160 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
27170 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NLY) ){.        
27180 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
27190 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
271a0 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20  ULTIROW ){.     
271b0 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20       bFordelete 
271c0 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  = OPFLAG_FORDELE
271d0 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TE;.        }.  
271e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
271f0 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
27200 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  gs = (wsFlags & 
27210 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  ~WHERE_IDX_ONLY)
27220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27230 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
27240 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
27250 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
27260 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
27270 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
27280 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
27290 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
272a0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
272b0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
272c0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
272d0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
272e0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
272f0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
27300 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
27310 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
27320 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
27330 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
27340 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
27350 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
27360 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
27370 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
27380 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
27390 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
273a0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
273b0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
273c0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
273d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
273e0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
273f0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
27400 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
27410 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
27420 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
27430 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
27440 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
27450 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
27460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27470 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
27480 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
27490 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
274a0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
274b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
274c0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
274d0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
274e0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
274f0 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
27500 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
27510 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
27520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27530 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
27540 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
27550 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
27560 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
27570 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
27580 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
27590 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
275a0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
275b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
275c0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
275d0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
275e0 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
275f0 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
27600 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
27610 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
27620 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
27630 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
27640 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
27650 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
27660 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
27670 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
27680 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
27690 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
276a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
276b0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
276c0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
276d0 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
276e0 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
276f0 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
27700 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
27710 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
27720 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
27730 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
27740 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
27750 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
27760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
27770 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
27780 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
27790 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29  Tab->nCol==BMS )
277a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
277b0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
277c0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
277d0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48  b->nCol<BMS && H
277e0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
277f0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
27800 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
27810 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
27820 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
27830 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
27840 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
27850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27860 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51  angeP4(v, -1, SQ
27870 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
27880 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
27890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
278a0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
278b0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
278c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
278d0 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20  SOR_HINTS.      
278e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  if( pLoop->u.btr
278f0 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
27900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27910 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
27920 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f  PFLAG_SEEKEQ|bFo
27930 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  rdelete);.      
27940 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
27950 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c     {.        sql
27960 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
27970 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b  (v, bFordelete);
27980 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
27990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
279a0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
279b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
279c0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
279d0 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54  _ColumnsUsed, pT
279e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
279f0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70     (const u8*)&p
27a20 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
27a30 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
27a40 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
27a50 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
27a60 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
27a70 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
27a80 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
27a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
27aa0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
27ab0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
27ac0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
27ad0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
27ae0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
27af0 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  int iIndexCur;. 
27b00 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
27b10 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
27b20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73 20 61   /* iAuxArg is a
27b30 6c 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20  lways set if to 
27b40 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
27b50 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70   if ONEPASS is p
27b60 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ossible */.     
27b70 20 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67   assert( iAuxArg
27b80 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e  !=0 || (pWInfo->
27b90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27ba0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
27bb0 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
27bc0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
27bd0 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  ab) && IsPrimary
27be0 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20  KeyIndex(pIx).  
27bf0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
27c00 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
27c10 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20  ABLE_ONLY)!=0.  
27c20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
27c30 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65  * This is one te
27c40 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69  rm of an OR-opti
27c50 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74  mization using t
27c60 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
27c70 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  f a.        ** W
27c80 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
27c90 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72  le.  No need for
27ca0 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
27cb0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e  x */.        iIn
27cc0 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  dexCur = pLevel-
27cd0 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20  >iTabCur;.      
27ce0 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20    op = 0;.      
27cf0 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f  }else if( pWInfo
27d00 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
27d10 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
27d20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
27d30 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
27d40 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        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 61 73 73 65  rg;.        asse
27d70 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
27d80 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
27d90 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
27da0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
27db0 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
27dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
27dd0 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
27de0 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
27df0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
27e00 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
27e10 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
27e20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
27e30 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
27e40 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
27e50 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26 20   if( iAuxArg && 
27e60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
27e70 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
27e80 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
27e90 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
27ea0 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66  xArg;.        if
27eb0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
27ec0 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20  HERE_REOPEN_IDX 
27ed0 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e  ) op = OP_Reopen
27ee0 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
27ef0 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
27f00 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
27f10 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
27f20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
27f30 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
27f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27f50 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
27f60 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
27f70 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
27f80 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
27f90 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
27fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27fb0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
27fc0 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
27fd0 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
27fe0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
27ff0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
28000 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
28010 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
28020 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
28030 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
28040 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
28050 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
28060 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
28070 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
28080 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
28090 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
280a0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
280b0 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  N)==0.        ){
280c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
280d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
280e0 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
280f0 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
28100 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
28110 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
28120 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
28130 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66  Ix->zName));.#if
28140 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
28150 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
28160 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  SK.        {.   
28170 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73         u64 colUs
28180 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
28190 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
281a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
281b0 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d  ; ii<pIx->nColum
281c0 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
281d0 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e        jj = pIx->
281e0 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20  aiColumn[ii];.  
281f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
28200 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
28210 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
28220 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a  j>63 ) jj = 63;.
28230 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28240 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  (pTabItem->colUs
28250 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29  ed & MASKBIT(jj)
28260 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
28270 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
28280 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29  Used |= ((u64)1)
28290 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20  <<(ii<63 ? ii : 
282a0 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  63);.          }
282b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
282c0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
282d0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
282e0 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30  ed, iIndexCur, 0
282f0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73       (u8*)&colUs
28320 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ed, P4_INT64);. 
28330 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
28340 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
28350 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
28360 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  K */.      }.   
28370 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
28380 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
28390 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
283a0 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
283b0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
283c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
283d0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
283e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
283f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
28400 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
28410 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
28420 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
28430 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
28440 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
28450 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
28460 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
28470 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
28480 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
28490 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
284a0 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
284b0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
284c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
284d0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
284e0 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
284f0 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  ;.    int wsFlag
28500 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  s;.    pLevel = 
28510 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
28520 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c      wsFlags = pL
28530 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
28540 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53  Flags;.#ifndef S
28550 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
28560 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
28570 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
28580 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
28590 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
285a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
285b0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
285c0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
285d0 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
285e0 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
285f0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
28600 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
28610 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
28620 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28630 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
28640 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
28650 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64   }.#endif.    ad
28660 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
28670 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
28680 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
28690 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
286a0 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
286b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
286c0 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20  rlFlags.    );. 
286d0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42     pLevel->addrB
286e0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
286f0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
28700 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
28710 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65  sqlite3WhereCode
28720 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
28730 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64  nfo, ii, notRead
28740 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
28750 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
28760 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
28770 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26 57    if( (wsFlags&W
28780 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
28790 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  0 && (wctrlFlags
287a0 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
287b0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
287c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64    sqlite3WhereAd
287d0 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70  dScanStatus(v, p
287e0 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
287f0 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20   addrExplain);. 
28800 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
28810 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
28820 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
28830 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
28840 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
28850 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
28860 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
28870 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
28880 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
28890 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
288a0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
288b0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
288c0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
288d0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
288e0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
288f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28900 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
28910 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
28920 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
28930 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
28940 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
28950 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
28960 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
28970 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
28980 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
28990 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
289a0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
289b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
289c0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
289d0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
289e0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
289f0 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
28a00 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
28a10 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
28a20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28a30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
28a40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
28a50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
28a60 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
28a70 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
28a80 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
28a90 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
28aa0 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
28ab0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
28ac0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
28ad0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
28ae0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
28af0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
28b00 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
28b10 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
28b20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
28b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28b40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
28b50 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
28b60 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
28b70 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
28b80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28b90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
28ba0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
28bb0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
28bc0 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
28bd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28be0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
28bf0 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
28c00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
28c10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28c20 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
28c30 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
28c40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28c50 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
28c60 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
28c70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28c80 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
28c90 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d  OP_VNext);.    }
28ca0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
28cb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28cc0 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
28cd0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
28ce0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
28cf0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
28d00 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
28d10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28d20 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
28d30 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
28d40 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
28d50 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
28d60 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
28d70 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
28d80 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
28d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
28da0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
28db0 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
28dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28dd0 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
28de0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
28df0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
28e00 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  nTop);.        V
28e10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
28e20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
28e30 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
28e40 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
28e50 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  evIfOpen);.     
28e60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28e70 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
28e80 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f  opOp==OP_NextIfO
28e90 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pen);.        sq
28ea0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28eb0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
28ec0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
28ed0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28ee0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28ef0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
28f00 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
28f10 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
28f20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28f30 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
28f40 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
28f50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
28f60 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
28f70 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
28f80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
28f90 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
28fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
28fb0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
28fc0 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
28fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
28fe0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
28ff0 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
29000 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
29010 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
29020 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
29030 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
29040 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
29050 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69   int op;.      i
29060 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  f( sqlite3VdbeGe
29070 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  tOp(v, pLevel->a
29080 64 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70  ddrLikeRep-1)->p
29090 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  1 ){.        op 
290a0 3d 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  = OP_DecrJumpZer
290b0 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  o;.      }else{.
290c0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
290d0 4a 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20  JumpZeroIncr;.  
290e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
290f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29100 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69   op, pLevel->iLi
29110 6b 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65  keRepCntr, pLeve
29120 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b  l->addrLikeRep);
29130 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
29140 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65  age(v);.    }.#e
29150 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65  ndif.    if( pLe
29160 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
29170 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  {.      addr = s
29180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
29190 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
291a0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
291b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
291c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
291d0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
291e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
291f0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
29200 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   || (pLoop->wsFl
29210 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
29220 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
29230 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
29240 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
29250 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
29260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29270 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
29280 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
29290 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
292a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
292b0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
292c0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
292d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
292e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
292f0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
29300 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
29310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29320 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
29330 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
29340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29350 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
29360 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
29370 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
29380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29390 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
293a0 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
293b0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
293c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
293d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
293e0 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
293f0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
29400 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
29410 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
29420 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
29430 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
29440 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
29450 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
29460 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
29470 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
29480 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
29490 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
294a0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
294b0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
294c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
294d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
294e0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
294f0 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
29500 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
29510 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
29520 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
29530 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
29540 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
29550 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
29560 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
29570 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
29580 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
29590 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
295a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
295b0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
295c0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
295d0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
295e0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
295f0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
29600 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
29610 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
29620 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
29630 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
29640 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
29650 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
29660 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
29670 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
29680 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
29690 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
296a0 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
296b0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
296c0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
296d0 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
296e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
296f0 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
29700 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d  outine && !db->m
29710 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
29720 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
29730 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c  lumnToCopy(v, pL
29740 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
29750 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
29760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
29780 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
29790 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  , 0);.      cont
297a0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
297b0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
297c0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
297d0 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
297e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
297f0 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70  in..    ** Excep
29800 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20  t, do not close 
29810 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c  cursors that wil
29820 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74  l be reused by t
29830 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
29840 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45  on.    ** (WHERE
29850 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
29860 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63  ).  And do not c
29870 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  lose the OP_Open
29880 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20  Write cursors.  
29890 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
298a0 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
298b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
298c0 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  /.    if( (pTab-
298d0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
298e0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
298f0 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
29900 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
29910 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
29920 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
29930 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
29940 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
29950 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
29960 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  gs;.      if( pW
29970 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
29980 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28  ONEPASS_OFF && (
29990 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
299a0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
299b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
299c0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
299d0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
299e0 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
299f0 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
29a00 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
29a10 20 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20         && (ws & 
29a20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
29a30 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30  _AUTO_INDEX))==0
29a40 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76   .       && pLev
29a50 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49  el->iIdxCur!=pWI
29a60 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
29a70 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20  s[1].      ){.  
29a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29a90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
29aa0 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
29ab0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
29ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
29ad0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
29ae0 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
29af0 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
29b00 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
29b10 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
29b20 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
29b30 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
29b40 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
29b50 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
29b60 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
29b70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
29b80 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
29b90 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
29ba0 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
29bb0 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
29bc0 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
29bd0 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
29be0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
29bf0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
29c00 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
29c10 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
29c20 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
29c30 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
29c40 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
29c50 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
29c60 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
29c70 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
29c80 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
29c90 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
29ca0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
29cb0 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
29cc0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
29cd0 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
29ce0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
29cf0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
29d00 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
29d10 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
29d20 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
29d30 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
29d40 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
29d50 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
29d60 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
29d70 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
29d80 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
29d90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
29da0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
29db0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
29dc0 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
29dd0 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20  .    if( pIdx.  
29de0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65     && (pWInfo->e
29df0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
29e00 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69  _OFF || !HasRowi
29e10 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29  d(pIdx->pTable))
29e20 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  .     && !db->ma
29e30 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29  llocFailed.    )
29e40 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
29e50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
29e60 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
29e70 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
29e80 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
29e90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29ea0 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
29eb0 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
29ec0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
29ed0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
29ee0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
29ef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29f00 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
29f10 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
29f20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
29f30 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  x = pOp->p2;.   
29f40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29f50 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
29f60 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  b );.          i
29f70 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
29f80 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
29f90 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
29fa0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
29fb0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
29fc0 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b           x = pPk
29fd0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20  ->aiColumn[x];. 
29fe0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
29ff0 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
2a000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a010 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
2a020 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
2a030 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
2a040 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
2a050 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
2a060 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
2a070 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2a080 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2a090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a0a0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
2a0b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a0c0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2a0d0 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2a0e0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2a0f0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2a100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2a110 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2a120 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2a130 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2a140 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2a150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
2a170 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
2a180 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
2a190 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2a1a0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2a1b0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
2a1c0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2a1d0 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.