/ Hex Artifact Content
Login

Artifact fe7925faafbe9a458972035c0bb4753d672f04ed:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0690: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
06a0: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
06b0: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  o in order to co
06c0: 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69  ntinue.** immedi
06d0: 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e  ately with the n
06e0: 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45  ext row of a WHE
06f0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  RE clause..*/.in
0700: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  t sqlite3WhereCo
0710: 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72  ntinueLabel(Wher
0720: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0730: 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
0740: 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ->iContinue!=0 )
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
0760: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
0770: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0780: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
0790: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
07a0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
07b0: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
07c0: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
07d0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
07e0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
07f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0800: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0810: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
0820: 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f   Return ONEPASS_
0830: 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50  OFF (0) if an UP
0840: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
0850: 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62  tatement is unab
0860: 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65  le to.** operate
0870: 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
0880: 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20   rowis returned 
0890: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
08a0: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e  e.  Return.** ON
08b0: 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29  EPASS_SINGLE (1)
08c0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
08d0: 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  t can operation 
08e0: 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65  directly because
08f0: 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c   only.** a singl
0900: 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63  e row is to be c
0910: 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20  hanged.  Return 
0920: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32  ONEPASS_MULTI (2
0930: 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73  ) if the one-pas
0940: 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s.** optimizatio
0950: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e  n can be used on
0960: 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a   multiple .**.**
0970: 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20   If the ONEPASS 
0980: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
0990: 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f  used (if this ro
09a0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
09b0: 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f  ue).** then also
09c0: 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63   write the indic
09d0: 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f  es of open curso
09e0: 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41  rs used by ONEPA
09f0: 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72  SS.** into aiCur
0a00: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0a10: 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73  .  iaCur[0] gets
0a20: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   the cursor of t
0a30: 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65  he data.** table
0a40: 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65   and iaCur[1] ge
0a50: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  ts the cursor us
0a60: 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61  ed by an auxilia
0a70: 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74  ry index..** Eit
0a80: 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65  her value may be
0a90: 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
0aa0: 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e  that cursor is n
0ab0: 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20  ot used..** Any 
0ac0: 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64  cursors returned
0ad0: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
0ae0: 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
0af0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b  ng..**.** aiCur[
0b00: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20  0] and aiCur[1] 
0b10: 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74  both get -1 if t
0b20: 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20  he where-clause 
0b30: 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62  logic is.** unab
0b40: 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e  le to use the ON
0b50: 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69  EPASS optimizati
0b60: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
0b70: 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73  e3WhereOkOnePass
0b80: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0b90: 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b  fo, int *aiCur){
0ba0: 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c  .  memcpy(aiCur,
0bb0: 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
0bc0: 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e  ePass, sizeof(in
0bd0: 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48  t)*2);.#ifdef WH
0be0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
0bf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
0c00: 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e  ereTrace && pWIn
0c10: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
0c20: 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
0c30: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0c40: 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a  ntf("%s cursors:
0c50: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
0c60: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65      pWInfo->eOne
0c70: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49  Pass==ONEPASS_SI
0c80: 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f  NGLE ? "ONEPASS_
0c90: 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41  SINGLE" : "ONEPA
0ca0: 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20  SS_MULTI",.     
0cb0: 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69      aiCur[0], ai
0cc0: 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e  Cur[1]);.  }.#en
0cd0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49  dif.  return pWI
0ce0: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d  nfo->eOnePass;.}
0cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
0d00: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63   content of pSrc
0d10: 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73   into pDest.*/.s
0d20: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
0d30: 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65  OrMove(WhereOrSe
0d40: 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f  t *pDest, WhereO
0d50: 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70  rSet *pSrc){.  p
0d60: 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e  Dest->n = pSrc->
0d70: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73  n;.  memcpy(pDes
0d80: 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70  t->a, pSrc->a, p
0d90: 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70  Dest->n*sizeof(p
0da0: 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a  Dest->a[0]));.}.
0db0: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e  ./*.** Try to in
0dc0: 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65  sert a new prere
0dd0: 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74  quisite/cost ent
0de0: 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  ry into the Wher
0df0: 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a  eOrSet pSet..**.
0e00: 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79  ** The new entry
0e10: 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
0e20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
0e30: 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
0e40: 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20  be.** appended, 
0e50: 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  or it might be d
0e60: 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68  iscarded.  Do wh
0e70: 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69  atever is the ri
0e80: 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20  ght thing.** so 
0e90: 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20  that pSet keeps 
0ea0: 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65  the N_OR_COST be
0eb0: 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20  st entries seen 
0ec0: 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69  so far..*/.stati
0ed0: 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73  c int whereOrIns
0ee0: 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65  ert(.  WhereOrSe
0ef0: 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a  t *pSet,      /*
0f00: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
0f10: 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f  to be updated */
0f20: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
0f30: 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  q,        /* Pre
0f40: 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68  requisites of th
0f50: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  e new entry */. 
0f60: 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20   LogEst rRun,   
0f70: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63          /* Run-c
0f80: 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65  ost of the new e
0f90: 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ntry */.  LogEst
0fa0: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20   nOut           
0fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
0fc0: 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65  tputs for the ne
0fd0: 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20  w entry */.){.  
0fe0: 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72  u16 i;.  WhereOr
0ff0: 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69  Cost *p;.  for(i
1000: 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74  =pSet->n, p=pSet
1010: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1020: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75  ++){.    if( rRu
1030: 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70  n<=p->rRun && (p
1040: 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65  rereq & p->prere
1050: 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20  q)==prereq ){.  
1060: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72      goto whereOr
1070: 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20  Insert_done;.   
1080: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1090: 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e  un<=rRun && (p->
10a0: 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29  prereq & prereq)
10b0: 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ==p->prereq ){. 
10c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10e0: 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54  Set->n<N_OR_COST
10f0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65   ){.    p = &pSe
1100: 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b  t->a[pSet->n++];
1110: 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  .    p->nOut = n
1120: 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Out;.  }else{.  
1130: 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20    p = pSet->a;. 
1140: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53     for(i=1; i<pS
1150: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1160: 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70     if( p->rRun>p
1170: 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29  Set->a[i].rRun )
1180: 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69   p = pSet->a + i
1190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11a0: 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20  p->rRun<=rRun ) 
11b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68  return 0;.  }.wh
11c0: 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65  ereOrInsert_done
11d0: 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20  :.  p->prereq = 
11e0: 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75  prereq;.  p->rRu
11f0: 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20  n = rRun;.  if( 
1200: 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70  p->nOut>nOut ) p
1210: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
1220: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1230: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
1240: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
1250: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
1260: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
1270: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
1280: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
1290: 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65  /.Bitmask sqlite
12a0: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68  3WhereGetMask(Wh
12b0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
12c0: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
12d0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
12e0: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
12f0: 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  >n<=(int)sizeof(
1300: 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  Bitmask)*8 );.  
1310: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
1320: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1330: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
1340: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
1350: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d  {.      return M
1360: 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
1370: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1390: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
13a0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
13b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
13c0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
13d0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
13e0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
13f0: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
1400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1410: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
1420: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
1430: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
1440: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
1450: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
1460: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
1470: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
1480: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
1490: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
14a0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
14b0: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
14c0: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
14d0: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
14e0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
14f0: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
1500: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
1510: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
1520: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
1530: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  or;.}../*.** Adv
1540: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1550: 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20   WhereTerm that 
1560: 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e  matches accordin
1570: 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69  g to the criteri
1580: 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64  a.** established
1590: 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20   when the pScan 
15a0: 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69  object was initi
15b0: 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53  alized by whereS
15c0: 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65  canInit()..** Re
15d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
15e0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d  re are no more m
15f0: 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72  atching WhereTer
1600: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  ms..*/.static Wh
1610: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
1620: 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e  anNext(WhereScan
1630: 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20   *pScan){.  int 
1640: 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1650: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
1660: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
1670: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69   term */.  i16 i
1680: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1690: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e  /* The column on
16a0: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16b0: 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50  term.  -1 for IP
16c0: 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b  K */.  Expr *pX;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  n expression bei
16f0: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57  ng tested */.  W
1700: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1710: 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64      /* Shorthand
1720: 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20   for pScan->pWC 
1730: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1740: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65  pTerm;    /* The
1750: 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74   term being test
1760: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20  ed */.  int k = 
1770: 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20  pScan->k;    /* 
1780: 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73  Where to start s
1790: 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68  canning */..  wh
17a0: 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ile( pScan->iEqu
17b0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
17c0: 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20  v ){.    iCur = 
17d0: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
17e0: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
17f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63     iColumn = pSc
1800: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53 63  an->aiColumn[pSc
1810: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1820: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
1830: 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61 6e  XN_EXPR && pScan
1840: 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29 20  ->pIdxExpr==0 ) 
1850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
1860: 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61  ile( (pWC = pSca
1870: 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20  n->pWC)!=0 ){.  
1880: 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1890: 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e  C->a+k; k<pWC->n
18a0: 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d  Term; k++, pTerm
18b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18c0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
18d0: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
18e0: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
18f0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
1900: 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69  n.         && (i
1910: 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a  Column!=XN_EXPR.
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1930: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1940: 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  re(pTerm->pExpr-
1950: 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70 49  >pLeft,pScan->pI
1960: 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29  dxExpr,iCur)==0)
1970: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
1980: 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c  can->iEquiv<=1 |
1990: 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
19a0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
19b0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
19c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
19d0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
19f0: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
1a00: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
1a10: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
1a20: 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20  Scan->aiCur).   
1a30: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d          && (pX =
1a40: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1a50: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
1a60: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
1a70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
1a80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1a90: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
1aa0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1ab0: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
1ac0: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
1ad0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
1ae0: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
1af0: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
1b00: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
1b10: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
1b20: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b70: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
1b80: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
1b90: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
1ba0: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
1bb0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1bc0: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
1bd0: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
1be0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
1bf0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
1c00: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1c10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c20: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1c30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
1c40: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
1c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c60: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
1c70: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
1c80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
1c90: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
1ca0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
1cb0: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
1cc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1cd0: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
1cf0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
1d10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
1d20: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1d40: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d60: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
1d70: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
1d80: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
1d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dd0: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
1de0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
1df0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1e00: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1e10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
1e50: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e70: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
1e80: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1e90: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1eb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ec0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
1ed0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f20: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1f30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1f40: 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20  _EQ|WO_IS))!=0. 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1f60: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1f70: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
1f80: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1f90: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
1fa0: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  able==pScan->aiC
1fb0: 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  ur[0].          
1fc0: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
1fd0: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75  n==pScan->aiColu
1fe0: 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  mn[0].          
1ff0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2000: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2010: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2020: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
2030: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2050: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
2060: 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20  ->k = k+1;.     
2070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
2080: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
2090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a0: 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e   }.      pScan->
20b0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
20c0: 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20  ->pOuter;.      
20d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  k = 0;.    }.   
20e0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
20f0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20  can->pOrigWC;.  
2100: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63    k = 0;.    pSc
2110: 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20  an->iEquiv++;.  
2120: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2130: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2140: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2150: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
2160: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2170: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
2180: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
2190: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
21a0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
21b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
21c0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
21d0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
21e0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
21f0: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
2200: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
2210: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2220: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
2230: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
2240: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
2250: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
2260: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
2270: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
2280: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
2290: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
22a0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
22b0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
22c0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
22d0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
22e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
22f0: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
2300: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2310: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
2320: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
2330: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
2340: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
2350: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
2360: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
2370: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
2380: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
2390: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
23a0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
23b0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
23c0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
23d0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
23e0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
23f0: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
2400: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
2410: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
2420: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
2430: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
2440: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
2450: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2460: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2470: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
2480: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2490: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
24a0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
24b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
24c0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
24d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24f0: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
2500: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
2510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2520: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
2530: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
2540: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2550: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2560: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
2570: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
2580: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 0a  {.  int j = 0;..
2590: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
25a0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
25b0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
25c0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
25d0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
25e0: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
25f0: 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20 69  IdxExpr = 0;.  i
2600: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 6a  f( pIdx ){.    j
2610: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = iColumn;.    
2620: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
2630: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2640: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
2650: 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e 70  _EXPR ) pScan->p
2660: 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  IdxExpr = pIdx->
2670: 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
2680: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 69 43  Expr;.    if( iC
2690: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
26a0: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
26b0: 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
26c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 20  .  }.  if( pIdx 
26d0: 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  && iColumn>=0 ){
26e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
26f0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
2700: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2710: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 70  .affinity;.    p
2720: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
2730: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
2740: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
2750: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
2760: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
2770: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
2780: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
2790: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
27a0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
27b0: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69  an->aiCur[0] = i
27c0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69  Cur;.  pScan->ai
27d0: 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c  Column[0] = iCol
27e0: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
27f0: 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61  quiv = 1;.  pSca
2800: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->iEquiv = 1;. 
2810: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
2820: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
2830: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2840: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
2850: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2860: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2870: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2880: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2890: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28a0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
28b0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
28c0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
28d0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
28e0: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
28f0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
2900: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
2910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2920: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2930: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2940: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
2950: 74 68 65 6e 20 73 65 61 72 63 68 20 66 6f 72 20  then search for 
2960: 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74  terms matching t
2970: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
2980: 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20  lumn of pIdx.** 
2990: 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
29a0: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
29b0: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  n of table iCur.
29c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
29d0: 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62  returned might b
29e0: 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68  y Y=<expr> if th
29f0: 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63  ere is another c
2a00: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20  onstraint in.** 
2a10: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a20: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
2a30: 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73  that X=Y.  Any s
2a40: 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  uch constraints 
2a50: 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74  will be.** ident
2a60: 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f  ified by the WO_
2a70: 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68 65  EQUIV bit in the
2a80: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
2a90: 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a  r field.  The.**
2aa0: 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d   aiCur[]/iaColum
2ab0: 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20  n[] arrays hold 
2ac0: 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71  X and all its eq
2ad0: 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65  uivalents. There
2ae0: 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73   are 11.** slots
2af0: 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f   in aiCur[]/aiCo
2b00: 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d  lumn[] so that m
2b10: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
2b20: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
2b30: 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71  o 10.** other eq
2b40: 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e  uivalent values.
2b50: 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68    Hence a search
2b60: 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75   for X will retu
2b70: 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41  rn <expr> if X=A
2b80: 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61  1.** and A1=A2 a
2b90: 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e  nd A2=A3 and ...
2ba0: 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20   and A9=A10 and 
2bb0: 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a  A10=<expr>..**.*
2bc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d  * If there are m
2bd0: 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
2be0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2bf0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  e of the form "X
2c00: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
2c10: 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68   then try for th
2c20: 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65  e one with no de
2c30: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65  pendencies on <e
2c40: 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20  xpr> - in other 
2c50: 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c  words where.** <
2c60: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74  expr> is a const
2c70: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ant expression o
2c80: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e  f some kind.  On
2c90: 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65  ly return entrie
2ca0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2cb0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
2cc0: 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e Y is a column 
2cd0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  in another table
2ce0: 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a   if no terms of.
2cf0: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
2d00: 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e  op> <const-expr>
2d10: 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f  " exist.   If no
2d20: 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f   terms with a co
2d30: 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78  nstant RHS.** ex
2d40: 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75  ist, try to retu
2d50: 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64  rn a term that d
2d60: 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45  oes not use WO_E
2d70: 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  QUIV..*/.WhereTe
2d80: 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  rm *sqlite3Where
2d90: 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  FindTerm(.  Wher
2da0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2db0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2dc0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
2dd0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
2de0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2df0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2e00: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
2e10: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
2e20: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2e30: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2e40: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2e50: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
2e60: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
2e70: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
2e80: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
2e90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2ea0: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
2eb0: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
2ec0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
2ed0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
2ee0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
2ef0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
2f00: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
2f10: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
2f20: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
2f30: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2f40: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
2f50: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
2f60: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
2f70: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
2f80: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
2f90: 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f   op &= WO_EQ|WO_
2fa0: 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  IS;.  while( p )
2fb0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
2fc0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
2fd0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2fe0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
2ff0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
3000: 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20  Operator&op)!=0 
3010: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
3020: 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f  ase( p->eOperato
3030: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
3040: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
3050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3060: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
3070: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
3080: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
3090: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
30a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
30b0: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
30c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
30d0: 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61  ches pList for a
30e0: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  n entry that mat
30f0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
3100: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
3110: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
3120: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
3130: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
3140: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
3150: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
3160: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
3170: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
3180: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
3190: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
31a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
31b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
31e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
31f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
3200: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3210: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
3220: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
3230: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
3250: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
3260: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
3270: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
3280: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
3290: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
32a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
32b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
32e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
32f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
3300: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
3310: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
3320: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
3330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
3340: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3350: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3360: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3370: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
3380: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
3390: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
33a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
33b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
33c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
33d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
33e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
33f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
3400: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3410: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3420: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3430: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
3440: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
3450: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3460: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
3470: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
3480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3490: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
34a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
34b0: 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d  RUE if the iCol-
34c0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
34d0: 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e  ex pIdx is NOT N
34e0: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
34f0: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  t indexColumnNot
3500: 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78  Null(Index *pIdx
3510: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
3520: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
3530: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73  pIdx!=0 );.  ass
3540: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20  ert( iCol>=0 && 
3550: 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  iCol<pIdx->nColu
3560: 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78  mn );.  j = pIdx
3570: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
3580: 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  ;.  if( j>=0 ){.
3590: 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d      return pIdx-
35a0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
35b0: 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73  .notNull;.  }els
35c0: 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b  e if( j==(-1) ){
35d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
35e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35f0: 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20  rt( j==(-2) );. 
3600: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
3610: 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65 78   Assume an index
3620: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  ed expression ca
3630: 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20 61  n always yield a
3640: 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a   NULL */..  }.}.
3650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
3660: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
3670: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
3680: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
3690: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
36a0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
36b0: 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43  .**.** A DISTINC
36c0: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
36d0: 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73 65  ant if any subse
36e0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  t of the columns
36f0: 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54 49   in the.** DISTI
3700: 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f 6c  NCT list are col
3710: 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65  lectively unique
3720: 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 6c   and individuall
3730: 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  y non-null..*/.s
3740: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
3750: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
3760: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3780: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3790: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
37a0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
37b0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
37c0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
37d0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
37e0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
37f0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
3800: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
3810: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
3820: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
3830: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
3840: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
3850: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
3860: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
3890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
38a0: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
38b0: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
38c0: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
38d0: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
38e0: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
38f0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
3900: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
3910: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
3920: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
3930: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
3940: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
3950: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
3960: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
3970: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
3980: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
3990: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
39a0: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
39b0: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
39c0: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
39d0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
39e0: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
39f0: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
3a00: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
3a10: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
3a20: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
3a30: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
3a40: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
3a50: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
3a60: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
3a70: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
3a80: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
3a90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
3aa0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
3ab0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
3ac0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
3ad0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
3ae0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
3af0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3b00: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
3b10: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
3b20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
3b30: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
3b40: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
3b50: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
3b60: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
3b70: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
3b80: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
3b90: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
3ba0: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
3bb0: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
3bc0: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
3bd0: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
3be0: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
3bf0: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
3c00: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
3c10: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
3c20: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
3c30: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
3c40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3c50: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
3c60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
3c70: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
3c80: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
3c90: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
3ca0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
3cb0: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
3cc0: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
3cd0: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
3ce0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
3cf0: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
3d00: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
3d10: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
3d20: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
3d30: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
3d40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d50: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
3d60: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
3d70: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
3d80: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
3d90: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
3da0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
3db0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
3dc0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
3dd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3de0: 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
3df0: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
3e00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3e10: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
3e20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  ++){.      if( 0
3e30: 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  ==sqlite3WhereFi
3e40: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
3e50: 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29  e, i, ~(Bitmask)
3e60: 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
3e70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
3e80: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
3e90: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
3ea0: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30  Base, pIdx, i)<0
3eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3ec0: 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d    if( indexColum
3ed0: 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69  nNotNull(pIdx, i
3ee0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
3ef0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3f00: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( i==pIdx->nKe
3f10: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  yCol ){.      /*
3f20: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
3f30: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
3f40: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3f50: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
3f60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3f80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
3f90: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
3fa0: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
3fb0: 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62  input value to b
3fc0: 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  ase 2..*/.static
3fd0: 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c   LogEst estLog(L
3fe0: 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75  ogEst N){.  retu
3ff0: 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73  rn N<=10 ? 0 : s
4000: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20  qlite3LogEst(N) 
4010: 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  - 33;.}../*.** C
4020: 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e  onvert OP_Column
4030: 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43   opcodes to OP_C
4040: 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c  opy in previousl
4050: 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  y generated code
4060: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4070: 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67  tine runs over g
4080: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
4090: 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65  de and translate
40a0: 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f  s OP_Column.** o
40b0: 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43  pcodes into OP_C
40c0: 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61 62  opy when the tab
40d0: 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63 65  le is being acce
40e0: 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74  ssed via co-rout
40f0: 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ine .** instead 
4100: 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f  of via table loo
4110: 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  kup..**.** If th
4120: 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61 72  e bIncrRowid par
4130: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
4140: 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69  n any OP_Rowid i
4150: 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a  nstructions on.*
4160: 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75 72  * cursor iTabCur
4170: 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64   are transformed
4180: 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20 4f   into OP_Null. O
4190: 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69 64  r, if bIncrRowid
41a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a   is non-zero,.**
41b0: 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52 6f   then each OP_Ro
41c0: 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  wid is transform
41d0: 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72  ed into an instr
41e0: 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65 6d  uction to increm
41f0: 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ent the.** value
4200: 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20 6f   stored in its o
4210: 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e 0a  utput register..
4220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
4230: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
4240: 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76 2c  Copy(.  Vdbe *v,
4250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4260: 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e 69  he VDBE containi
4270: 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e 73  ng code to trans
4280: 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  late */.  int iS
4290: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  tart,         /*
42a0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
42b0: 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74  this opcode to t
42c0: 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  he end */.  int 
42d0: 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20  iTabCur,        
42e0: 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f  /* OP_Column/OP_
42f0: 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73  Rowid references
4300: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
4310: 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65  /.  int iRegiste
4320: 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  r,      /* The f
4330: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69  irst column is i
4340: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
4350: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f  */.  int bIncrRo
4360: 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  wid      /* If n
4370: 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f  on-zero, transfo
4380: 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f  rm OP_rowid to O
4390: 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29  P_AddImm(1) */.)
43a0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  {.  VdbeOp *pOp 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
43c0: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
43d0: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
43e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
43f0: 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69  dr(v);.  for(; i
4400: 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61  Start<iEnd; iSta
4410: 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20  rt++, pOp++){.  
4420: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69    if( pOp->p1!=i
4430: 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
4440: 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e;.    if( pOp->
4450: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
4460: 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  n ){.      pOp->
4470: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79  opcode = OP_Copy
4480: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20  ;.      pOp->p1 
4490: 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67  = pOp->p2 + iReg
44a0: 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70  ister;.      pOp
44b0: 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  ->p2 = pOp->p3;.
44c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20        pOp->p3 = 
44d0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
44e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
44f0: 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
4500: 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20 29  if( bIncrRowid )
4510: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63  {.        /* Inc
4520: 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
4530: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
4540: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  2 operand of the
4550: 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20 20   OP_Rowid. */.  
4560: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4570: 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a 20  e = OP_AddImm;. 
4580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
4590: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
45a0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a 20    pOp->p2 = 1;. 
45b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
45c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
45d0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
45e0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
45f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20          pOp->p3 
4600: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4610: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4620: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
4630: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
4640: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
4650: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
4660: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
4670: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
4680: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4690: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
46a0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
46b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
46c0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
46d0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
46e0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
46f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4700: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4710: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
4720: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
4730: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
4740: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
4750: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
4760: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
4770: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
4780: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
4790: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
47a0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
47b0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
47c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
47d0: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
47e0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
47f0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
4800: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
4810: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4820: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
4830: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
4840: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
4850: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
4860: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4870: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
4880: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4890: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
48a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
48b0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
48c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
48d0: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
48e0: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
48f0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
4900: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
4910: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
4920: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
4930: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
4940: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
4950: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
4960: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
4970: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
4980: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
4990: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
49a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
49b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
49c0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
49d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
49e0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
49f0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
4a00: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
4a10: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4a20: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
4a30: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
4a40: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
4a50: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
4a60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
4a70: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
4a80: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
4a90: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
4aa0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
4ab0: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
4ac0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
4ad0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
4ae0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
4af0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
4b00: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
4b10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4b20: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
4b30: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
4b40: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
4b50: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4b60: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
4b70: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
4b80: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
4b90: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
4ba0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
4bb0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
4bc0: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
4bd0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
4be0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
4bf0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
4c00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4c10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4c20: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
4c30: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
4c40: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
4c50: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
4c60: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
4c70: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
4c80: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
4c90: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
4ca0: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
4cb0: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
4cc0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4ce0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4cf0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
4d00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
4d10: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
4d20: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
4d30: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
4d40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4d50: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
4d60: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
4d70: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
4d80: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
4d90: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
4da0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4db0: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
4dc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4dd0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
4de0: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
4df0: 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _IS))==0 ) retur
4e00: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
4e10: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
4e20: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
4e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4e40: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
4e50: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
4e60: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
4e70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
4e80: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
4e90: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
4ea0: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
4eb0: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
4ec0: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
4ed0: 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73  urn 0;.  testcas
4ee0: 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
4ef0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
4f00: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4f10: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
4f20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
4f30: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
4f40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
4f50: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
4f60: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
4f70: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
4f80: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
4f90: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
4fa0: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
4fb0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
4fc0: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
4fd0: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
4fe0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
4ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5000: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
5010: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
5020: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5040: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5050: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
5060: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
5070: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5080: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
5090: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
50a0: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
50b0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
50c0: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
50d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
50e0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
50f0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
5100: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
5110: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
5120: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
5130: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
5140: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
5150: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5160: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5180: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
5190: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
51a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
51b0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
51d0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
51e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
51f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
5200: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
5210: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
5220: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5230: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
5240: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
5250: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
5260: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
5270: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5290: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
52a0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
52b0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
52c0: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
52d0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
52e0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
52f0: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
5300: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
5310: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
5320: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5330: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5340: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
5370: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
5380: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
5390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
53a0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
53b0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
53c0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
53f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5410: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5420: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5430: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
5440: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
5450: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
5460: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
5470: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5490: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
54a0: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
54b0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
54c0: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
54d0: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
54e0: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
54f0: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
5500: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
5510: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
5520: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
5530: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
5540: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
5550: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
5560: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
5570: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
5580: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
5590: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
55a0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
55b0: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
55c0: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
55d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
55e0: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
55f0: 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70   issued */.  Exp
5600: 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b  r *pPartial = 0;
5610: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74           /* Part
5620: 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73  ial Index Expres
5630: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sion */.  int iC
5640: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20  ontinue = 0;    
5650: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5660: 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75  re to skip exclu
5670: 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74  ded rows */.  st
5680: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5690: 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
56a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
56b0: 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  m being indexed 
56c0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 75  */.  int addrCou
56d0: 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nter = 0;       
56e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65 72   /* Address wher
56f0: 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 65  e integer counte
5700: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5710: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
5720: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5730: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
5740: 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72 65  gisters where re
5750: 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c 65  cord is assemble
5760: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
5770: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
5780: 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
5790: 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
57a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
57b0: 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
57c0: 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
57d0: 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
57e0: 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
57f0: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
5800: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5810: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
5820: 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
5830: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
5840: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5850: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
5860: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
5870: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
5880: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
5890: 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
58a0: 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
58b0: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
58c0: 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20  ts */.  nKeyCol 
58d0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
58e0: 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
58f0: 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
5900: 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
5910: 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
5920: 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
5930: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
5940: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
5950: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
5960: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
5970: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
5980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
5990: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
59a0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
59b0: 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20 61  )    /* prereq a
59c0: 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a  lways non-zero *
59d0: 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  /.         || pE
59e0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
59f0: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
5a00: 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20 74  sor   /*   for t
5a10: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20 20  he right-hand   
5a20: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5a30: 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30 20  Loop->prereq!=0 
5a40: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
5a50: 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62 6c         /*   tabl
5a60: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
5a70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
5a80: 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20 20  p->prereq==0.   
5a90: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46    && (pTerm->wtF
5aa0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
5ab0: 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  UAL)==0.     && 
5ac0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5ad0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
5ae0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71 6c  oin).     && sql
5af0: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
5b00: 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20 70  onstant(pExpr, p
5b10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b  Src->iCursor) ){
5b20: 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20  .      pPartial 
5b30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
5b40: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
5b50: 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  rtial,.         
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5b80: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
5b90: 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20  , pExpr, 0));.  
5ba0: 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d    }.    if( term
5bb0: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
5bc0: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
5bd0: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
5be0: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
5bf0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
5c00: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
5c10: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
5c20: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
5c30: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
5c40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5c50: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
5c60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5c70: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
5c80: 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69    if( !sentWarni
5c90: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
5ca0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5cb0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
5cc0: 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EX,.            
5cd0: 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78  "automatic index
5ce0: 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61   on %s(%s)", pTa
5cf0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
5d00: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
5d10: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
5d20: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57  );.        sentW
5d30: 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  arning = 1;.    
5d40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
5d50: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
5d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
5d70: 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
5d80: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
5d90: 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20  oop, nKeyCol+1) 
5da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
5db0: 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  o end_auto_index
5dc0: 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20  _create;.       
5dd0: 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70   }.        pLoop
5de0: 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c  ->aLTerm[nKeyCol
5df0: 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
5e00: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5e10: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  cMask;.      }. 
5e20: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
5e30: 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a  t( nKeyCol>0 );.
5e40: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
5e50: 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  .nEq = pLoop->nL
5e60: 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a  Term = nKeyCol;.
5e70: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
5e80: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
5e90: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
5ea0: 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
5eb0: 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  XED.            
5ec0: 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
5ed0: 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20  _AUTO_INDEX;..  
5ee0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5ef0: 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  ber of additiona
5f00: 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
5f10: 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a   to create a.  *
5f20: 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  * covering index
5f30: 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69  .  A "covering i
5f40: 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65  ndex" is an inde
5f50: 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
5f60: 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  all.  ** columns
5f70: 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64   that are needed
5f80: 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20   by the query.  
5f90: 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20  With a covering 
5fa0: 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20  index, the.  ** 
5fb0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e  original table n
5fc0: 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
5fd0: 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f   accessed.  Auto
5fe0: 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75  matic indices mu
5ff0: 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76  st.  ** be a cov
6000: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61  ering index beca
6010: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  use the index wi
6020: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
6030: 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72  d if the.  ** or
6040: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61  iginal table cha
6050: 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64  nges and the ind
6060: 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e  ex and table can
6070: 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64  not both be used
6080: 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f  .  ** if they go
6090: 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20   out of sync..  
60a0: 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d  */.  extraCols =
60b0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
60c0: 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53   (~idxCols | MAS
60d0: 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20  KBIT(BMS-1));.  
60e0: 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42  mxBitCol = MIN(B
60f0: 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f  MS-1,pTable->nCo
6100: 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  l);.  testcase( 
6110: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
6120: 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  S-1 );.  testcas
6130: 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
6140: 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28  =BMS-2 );.  for(
6150: 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
6160: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
6170: 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
6180: 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b  IT(i) ) nKeyCol+
6190: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
61a0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
61b0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
61c0: 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54     nKeyCol += pT
61d0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53  able->nCol - BMS
61e0: 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   + 1;.  }..  /* 
61f0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
6200: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
6210: 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
6220: 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  x */.  pIdx = sq
6230: 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
6240: 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d  exObject(pParse-
6250: 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20  >db, nKeyCol+1, 
6260: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  0, &zNotUsed);. 
6270: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67   if( pIdx==0 ) g
6280: 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  oto end_auto_ind
6290: 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f  ex_create;.  pLo
62a0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
62b0: 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
62c0: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
62d0: 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
62e0: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
62f0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
6300: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
6310: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
6320: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
6330: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
6340: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
6350: 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
6360: 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
6370: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
6380: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
6390: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
63a0: 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
63b0: 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
63c0: 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
63d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
63e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
63f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6400: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
6410: 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
6420: 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
6430: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
6440: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
6450: 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
6460: 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
6470: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
6480: 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
6490: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
64a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
64b0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
64c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
64d0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
64e0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
64f0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6500: 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d  = pColl ? pColl-
6510: 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33  >zName : sqlite3
6520: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
6530: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
6540: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6550: 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
6560: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
6570: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
6580: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
6590: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
65a0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
65b0: 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
65c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
65d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
65e0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
65f0: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6600: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
6610: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6620: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
6630: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
6640: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
6650: 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  NARY;.      n++;
6660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6670: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
6680: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
6690: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
66a0: 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
66b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
66c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
66d0: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
66e0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73  x->azColl[n] = s
66f0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6700: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
6710: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6720: 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
6730: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
6740: 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
6750: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6760: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
6770: 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  RY;..  /* Create
6780: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
6790: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
67a0: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
67b0: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
67c0: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
67d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
67e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
67f0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
6800: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
6810: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
6820: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
6830: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
6840: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
6860: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
6870: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
6880: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
6890: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
68a0: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
68b0: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
68c0: 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65  arse);.  pTabIte
68d0: 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f  m = &pWC->pWInfo
68e0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
68f0: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
6900: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6910: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6920: 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
6930: 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65  d = pTabItem->re
6940: 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64  gReturn;.    add
6950: 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  rCounter = sqlit
6960: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6970: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
6980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6990: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
69a0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
69b0: 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
69c0: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
69d0: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
69e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
69f0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6a00: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
6a10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6a20: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
6a30: 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
6a40: 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49  f \"%s\"", pTabI
6a50: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
6a60: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
6a70: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
6a80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6a90: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
6aa0: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
6ab0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6ac0: 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  }.  if( pPartial
6ad0: 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75   ){.    iContinu
6ae0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
6af0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
6b00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
6b10: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  lse(pParse, pPar
6b20: 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  tial, iContinue,
6b30: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
6b40: 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  LL);.    pLoop->
6b50: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
6b60: 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d  _PARTIALIDX;.  }
6b70: 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
6b80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6b90: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42  (pParse);.  regB
6ba0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e  ase = sqlite3Gen
6bb0: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20  erateIndexKey(. 
6bc0: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64       pParse, pId
6bd0: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
6be0: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  ur, regRecord, 0
6bf0: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  , 0, 0, 0.  );. 
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6c20: 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
6c30: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
6c40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6c50: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6c60: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6c70: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
6c80: 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
6c90: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
6ca0: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
6cb0: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
6cc0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6cd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6ce0: 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74  eP2(v, addrCount
6cf0: 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a  er, regBase+n);.
6d00: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
6d10: 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64  umnToCopy(v, add
6d20: 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  rTop, pLevel->iT
6d30: 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d  abCur, pTabItem-
6d40: 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a  >regResult, 1);.
6d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
6d60: 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
6d70: 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66  .    pTabItem->f
6d80: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
6d90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6db0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
6dc0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
6dd0: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
6de0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
6df0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6e00: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
6e10: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
6e20: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
6e30: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6e40: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
6e50: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6e60: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
6e70: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6e80: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
6e90: 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  rse);.  .  /* Ju
6ea0: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
6eb0: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
6ec0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
6ed0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6ee0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
6ef0: 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f  .end_auto_index_
6f00: 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65  create:.  sqlite
6f10: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6f20: 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c  se->db, pPartial
6f30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
6f40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
6f50: 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
6f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6f70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6f80: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6f90: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
6fa0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6fb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
6fc0: 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
6fd0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
6fe0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
6ff0: 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
7000: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
7010: 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
7020: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
7030: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
7040: 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
7050: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
7060: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7070: 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
7080: 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
7090: 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75  rse,.  WhereClau
70a0: 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61  se *pWC,.  Bitma
70b0: 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20  sk mUnusable,   
70c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
70d0: 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20  nore terms with 
70e0: 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f  these prereqs */
70f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7100: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20  t_item *pSrc,.  
7110: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
7120: 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  By.){.  int i, j
7130: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
7140: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7150: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7160: 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
7170: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7180: 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78  ex_orderby *pIdx
7190: 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63  OrderBy;.  struc
71a0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
71b0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
71c0: 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
71d0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
71e0: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
71f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7200: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  fo *pIdxInfo;.. 
7210: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
7220: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
7230: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
7240: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
7250: 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
7260: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7270: 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
7280: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
7290: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
72a0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
72b0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
72c0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
72d0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
72e0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
72f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
7300: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
7310: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
7320: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
7330: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
7340: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
7350: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7360: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7370: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
7380: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7390: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
73a0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
73b0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
73d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
73e0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
73f0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
7400: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
7410: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
7420: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c  ISNULL|WO_EQUIV|
7430: 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
7440: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7450: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7460: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
7470: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7480: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
7490: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
74a0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
74b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
74c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
74d0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
74e0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
74f0: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
7500: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
7510: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7520: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
7530: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7540: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7550: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
7560: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
7570: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
7580: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
7590: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
75a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
75b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
75c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
75d0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
75e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
75f0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
7600: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
7610: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
7620: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7630: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
7640: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
7650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7660: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
7670: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7680: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
7690: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
76a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
76b0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
76c0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
76f0: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
7700: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
7710: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
7740: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
7750: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
7760: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
7770: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7780: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
7790: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
77a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
77b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
77c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
77d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
77e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
77f0: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
7800: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
7810: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
7820: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
7830: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
7840: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
7850: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
7860: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
7870: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
7880: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
7890: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
78a0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
78b0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
78c0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
78d0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
78e0: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
78f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7900: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
7910: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
7920: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
7930: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7940: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7950: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
7960: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
7970: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
7980: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
7990: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
79a0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
79b0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
79c0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
79d0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
79e0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
79f0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
7a00: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
7a10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
7a20: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
7a30: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
7a40: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
7a50: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7a60: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7a70: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
7a80: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
7a90: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
7ae0: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
7af0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
7b00: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
7b10: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
7b20: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
7b30: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
7b40: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
7b50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7b60: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
7b70: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
7b80: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
7b90: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
7ba0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
7bb0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
7bc0: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
7bd0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7be0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
7bf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7c00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c10: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
7c20: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7c30: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7c40: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7c50: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7c60: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
7c70: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
7c80: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c90: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
7ca0: 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d  _EQUIV|WO_IS))==
7cb0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7cc0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
7cd0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
7ce0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
7cf0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
7d00: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
7d10: 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43  -1) );.    pIdxC
7d20: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
7d30: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7d40: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
7d50: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
7d60: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
7d70: 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
7d80: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
7d90: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
7da0: 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
7db0: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d 41     if( op==WO_MA
7dc0: 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70 20  TCH ){.      op 
7dd0: 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f  = pTerm->eMatchO
7de0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64  p;.    }.    pId
7df0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
7e00: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
7e10: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
7e20: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
7e30: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
7e40: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
7e50: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
7e60: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7e70: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
7e80: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
7e90: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
7ea0: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
7eb0: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
7ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7ed0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
7ee0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
7ef0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7f00: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
7f10: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
7f20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
7f30: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
7f40: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
7f50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f60: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
7f70: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
7f80: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
7f90: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
7fa0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7fb0: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
7fc0: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
7fd0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7fe0: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
7ff0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8000: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8010: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
8020: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8030: 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
8040: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
8050: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8070: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8080: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8090: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
80a0: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
80b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
80c0: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
80d0: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
80e0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
80f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
8100: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
8110: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
8120: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
8130: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
8140: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8150: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
8160: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
8170: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
8180: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
8190: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
81a0: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
81b0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
81c0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
81d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
81e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
81f0: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
8200: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
8210: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8220: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8230: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
8240: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
8250: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
8260: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
8270: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
8280: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8290: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
82a0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
82b0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
82c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
82d0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
82e0: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
82f0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
8300: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
8310: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
8320: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8330: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
8340: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8350: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
8360: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
8370: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
8380: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
8390: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
83a0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
83b0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
83c0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
83d0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
83e0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
83f0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
8400: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
8410: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
8420: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
8430: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
8440: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
8450: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
8460: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
8470: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
8480: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
8490: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
84a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
84b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
84c0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
84d0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
84e0: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
84f0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
8500: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8520: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8530: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8540: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8560: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8570: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8580: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8590: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
85a0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
85b0: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
85c0: 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f   = 0;..#if 0.  /
85d0: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
85e0: 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68  now caught by th
85f0: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53  e caller..  ** S
8600: 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74  earch for "xBest
8610: 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
8620: 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f  n" below */.  fo
8630: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
8640: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
8650: 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
8660: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
8670: 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
8680: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
8690: 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
86a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
86b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
86c0: 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
86d0: 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
86e0: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
86f0: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
8700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
8710: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
8720: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
8730: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
8740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8750: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
8760: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8770: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
8780: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
8790: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
87a0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
87b0: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
87c0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
87d0: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
87e0: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
87f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
8800: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
8810: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
8820: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
8830: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
8840: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8850: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
8860: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
8870: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
8880: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
8890: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
88a0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
88b0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
88c0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
88d0: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
88e0: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
88f0: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
8900: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8910: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
8920: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
8930: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
8940: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
8950: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8960: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
8970: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
8980: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
8990: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
89a0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
89b0: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
89c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
89d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
89e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
89f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
8a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8a10: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
8a20: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
8a30: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
8a40: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
8a50: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
8a60: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
8a70: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8a90: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
8aa0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
8ab0: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
8ac0: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
8ad0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
8ae0: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
8af0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
8b00: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
8b10: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
8b20: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b40: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
8b50: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
8b60: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
8b70: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8b90: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
8ba0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
8bb0: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
8bd0: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
8be0: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
8bf0: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
8c00: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8c20: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
8c30: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
8c40: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c60: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
8c70: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
8c80: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
8c90: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
8ca0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
8cb0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
8cc0: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
8cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ce0: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
8cf0: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
8d00: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
8d10: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
8d20: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
8d30: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
8d40: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
8d50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8d60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8d70: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
8d80: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
8d90: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
8da0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
8db0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
8dc0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
8dd0: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
8de0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
8df0: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
8e00: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
8e10: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
8e20: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
8e30: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
8e40: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
8e50: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
8e60: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
8e70: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
8e80: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
8e90: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
8ea0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
8eb0: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
8ec0: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
8ed0: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
8ee0: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
8ef0: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
8f00: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
8f10: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
8f20: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
8f30: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
8f40: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
8f50: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
8f60: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
8f70: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
8f80: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
8f90: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
8fa0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
8fb0: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
8fc0: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
8fd0: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
8fe0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
8ff0: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9000: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
9010: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
9020: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
9030: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9040: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
9050: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
9060: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
9070: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9080: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
9090: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
90a0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
90b0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
90c0: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
90d0: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
90e0: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
90f0: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
9100: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
9110: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
9120: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
9130: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
9140: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
9150: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
9160: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
9170: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
9180: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
9190: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
91a0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
91b0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
91c0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
91d0: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
91e0: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
91f0: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
9200: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
9210: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
9220: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
9230: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
9240: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
9250: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
9260: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9270: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
9280: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
9290: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
92a0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
92b0: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
92c0: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
92d0: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
92e0: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
92f0: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
9300: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
9310: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
9320: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
9330: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
9340: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9350: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
9360: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
9370: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
9380: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
9390: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
93a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
93b0: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
93c0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
93d0: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
93e0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
93f0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
9400: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
9410: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
9420: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
9430: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
9440: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
9450: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
9460: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
9470: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
9480: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
9490: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
94a0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
94b0: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
94c0: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
94d0: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
94e0: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
94f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
9500: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
9510: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
9520: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
9530: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
9540: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
9550: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
9560: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
9570: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
9580: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
9590: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
95a0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
95d0: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
95e0: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
95f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9610: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9620: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
9630: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
9640: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
9650: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
9660: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
9670: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
9680: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
9690: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
96a0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
96b0: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
96c0: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
96d0: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
96e0: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
96f0: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
9700: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
9710: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
9720: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
9730: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
9740: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
9750: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
9760: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
9770: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
9780: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
9790: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
97a0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
97b0: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
97c0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
97d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
97e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
97f0: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
9800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
9810: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
9820: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
9830: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9840: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
9850: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
9860: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
9870: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
9880: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
9890: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
98a0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
98b0: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
98c0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
98d0: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
98e0: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
98f0: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
9900: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
9910: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9920: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9930: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
9940: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
9950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
9960: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
9970: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
9980: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
9990: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
99a0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
99b0: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
99c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
99d0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
99e0: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
99f0: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
9a00: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
9a10: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
9a20: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
9a30: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
9a40: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
9a50: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
9a60: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
9a70: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
9a80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
9a90: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9aa0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
9ab0: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
9ac0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
9ad0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
9ae0: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
9af0: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
9b00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9b10: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
9b20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9b30: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
9b40: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
9b50: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
9b60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
9b70: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
9b80: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9b90: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9ba0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
9bb0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9bc0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9bd0: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9bf0: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
9c00: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
9c10: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
9c20: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
9c30: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
9c40: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
9c50: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
9c60: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
9c70: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
9c80: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
9c90: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
9ca0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
9cb0: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
9cc0: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
9cd0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9ce0: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
9cf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9d00: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
9d10: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
9d20: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9d30: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9d40: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
9d50: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
9d60: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9d70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9d80: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
9d90: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
9da0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
9db0: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
9dc0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
9dd0: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
9de0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9df0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
9e00: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
9e10: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
9e20: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
9e30: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
9e40: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
9e50: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
9e60: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
9e70: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
9e80: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
9e90: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
9ea0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
9eb0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
9ec0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
9ed0: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9ef0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9f00: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
9f10: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
9f20: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
9f30: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9f40: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9f50: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
9f60: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
9f70: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
9f80: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
9f90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9fa0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9fb0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9fc0: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
9fd0: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9ff0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
a000: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a010: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
a020: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
a030: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
a040: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
a050: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
a060: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
a070: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
a080: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
a090: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
a0a0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
a0b0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
a0c0: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
a0d0: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
a0e0: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
a0f0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a100: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
a110: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
a120: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
a130: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
a140: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
a150: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
a160: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
a170: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
a180: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
a190: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
a1a0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
a1b0: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
a1c0: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
a1d0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
a1e0: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
a1f0: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
a200: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
a210: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
a220: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
a230: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
a240: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
a250: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
a260: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
a270: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
a280: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
a290: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
a2a0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
a2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a2c0: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
a2d0: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
a2e0: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
a2f0: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
a300: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
a310: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
a320: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
a330: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
a340: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20  Eq[iCol];.  }.. 
a350: 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
a360: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c  pRec->nField val
a370: 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
a380: 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d  ing.  */.  pRec-
a390: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
a3a0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
a3b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a3c0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
a3d0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
a3e0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
a3f0: 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
a400: 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
a410: 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
a420: 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
a430: 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
a440: 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
a450: 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
a460: 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
a470: 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
a480: 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
a490: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
a4a0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
a4b0: 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
a4c0: 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
a4d0: 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
a4e0: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
a4f0: 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
a500: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
a510: 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
a520: 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
a530: 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
a540: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
a550: 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
a560: 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
a570: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
a580: 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
a590: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
a5a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
a5b0: 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
a5c0: 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
a5d0: 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
a5e0: 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
a5f0: 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
a600: 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
a610: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
a620: 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
a630: 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
a640: 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
a650: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
a660: 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
a670: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
a680: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
a690: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
a6a0: 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
a6b0: 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
a6c0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
a6d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
a6e0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
a6f0: 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
a700: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
a710: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
a720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a730: 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23  turn nRet;.}...#
a740: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a750: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a760: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
a770: 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72  the affinity for
a780: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
a790: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
a7a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71 6c  .static char sql
a7b0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
a7c0: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
a7d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
a7e0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61  , int iCol){.  a
a7f0: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
a800: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
a810: 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70  lumn );.  if( !p
a820: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  Idx->zColAff ){.
a830: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a840: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
a850: 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72  db, pIdx)==0 ) r
a860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
a870: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
a880: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
a890: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
a8a0: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
a8b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a8c0: 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
a8d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a8e0: 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
a8f0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
a900: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
a910: 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
a920: 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
a930: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
a940: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
a950: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
a960: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
a970: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a980: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
a990: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
a9a0: 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
a9b0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
a9c0: 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
a9d0: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
a9e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
a9f0: 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
aa00: 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
aa10: 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
aa20: 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
aa30: 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
aa40: 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
aa50: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
aa60: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
aa70: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
aa80: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
aa90: 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
aaa0: 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
aab0: 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
aac0: 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
aad0: 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
aae0: 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
aaf0: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
ab00: 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
ab10: 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
ab20: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
ab30: 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
ab40: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
ab50: 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
ab60: 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
ab70: 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
ab80: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
ab90: 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
aba0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
abb0: 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
abc0: 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
abd0: 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
abe0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
abf0: 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
ac00: 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
ac10: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
ac20: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
ac30: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
ac40: 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
ac50: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
ac60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
ac70: 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
ac80: 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
ac90: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
aca0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
acb0: 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
acc0: 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
acd0: 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
ace0: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
acf0: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
ad00: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ad10: 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
ad20: 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
ad30: 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
ad40: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
ad50: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
ad60: 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
ad70: 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
ad80: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
ad90: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
ada0: 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
adb0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
adc0: 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
add0: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
ade0: 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
adf0: 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
ae00: 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
ae10: 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
ae20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ae30: 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
ae40: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
ae50: 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
ae60: 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
ae70: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ae80: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
ae90: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
aea0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
aeb0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
aec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
aed0: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
aee0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
aef0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
af00: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
af10: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
af20: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
af30: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
af40: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
af50: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
af60: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
af70: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
af80: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
af90: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
afa0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
afb0: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
afc0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
afd0: 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
afe0: 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
aff0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
b000: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
b010: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
b020: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
b030: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
b040: 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
b050: 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
b060: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
b070: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
b080: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
b090: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
b0a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b0b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
b0c0: 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
b0d0: 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
b0e0: 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
b0f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b100: 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65   u8 aff = sqlite
b110: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b120: 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29  nity(db, p, nEq)
b130: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b140: 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
b150: 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
b160: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b170: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b180: 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
b190: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
b1a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b1b0: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b1c0: 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
b1d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b1e0: 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
b1f0: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b200: 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
b210: 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
b220: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b230: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
b240: 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
b250: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
b260: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b270: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
b280: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
b290: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
b2a0: 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
b2b0: 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
b2c0: 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
b2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b2e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b2f0: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b300: 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
b310: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b320: 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
b330: 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
b340: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
b350: 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
b360: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b370: 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
b380: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
b390: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
b3a0: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
b3b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b3c0: 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
b3d0: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
b3e0: 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
b3f0: 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
b400: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b410: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
b420: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b430: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
b440: 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
b450: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
b460: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
b470: 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
b480: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b490: 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
b4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
b4b0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
b4c0: 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
b4d0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
b4e0: 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
b4f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
b500: 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
b510: 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
b520: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
b530: 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
b540: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
b550: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
b560: 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
b570: 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
b580: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
b590: 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
b5a0: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
b5b0: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
b5c0: 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
b5d0: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
b5e0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
b5f0: 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
b600: 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
b610: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
b620: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
b630: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
b640: 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
b650: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
b660: 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
b670: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
b680: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
b690: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
b6a0: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
b6b0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
b6c0: 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
b6d0: 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
b6e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
b6f0: 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
b700: 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
b710: 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
b720: 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
b730: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
b740: 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
b750: 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
b760: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
b770: 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
b780: 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
b790: 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
b7a0: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
b7d0: 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
b7e0: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
b7f0: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
b800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
b810: 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
b820: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
b830: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
b840: 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
b850: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
b860: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
b870: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
b880: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
b890: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b8a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
b8b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
b8c0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b8d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b8e0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
b8f0: 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
b900: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
b910: 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
b920: 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
b930: 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
b940: 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
b950: 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
b960: 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
b970: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
b980: 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
b990: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
b9a0: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
b9b0: 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
b9c0: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
b9d0: 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
b9e0: 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
b9f0: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
ba00: 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
ba10: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
ba20: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
ba30: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
ba40: 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
ba50: 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
ba80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ba90: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
baa0: 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
bab0: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
bac0: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
bad0: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
bae0: 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
baf0: 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
bb00: 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
bb10: 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
bb20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
bb30: 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
bb40: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
bb50: 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d  .nEq) is the num
bb60: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
bb70: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
bb80: 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
bb90: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
bba0: 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
bbb0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
bbc0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
bbd0: 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
bbe0: 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
bbf0: 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
bc00: 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
bc10: 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
bc20: 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
bc30: 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
bc40: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
bc50: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
bc60: 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
bc70: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
bc80: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
bc90: 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
bca0: 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
bcb0: 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
bcc0: 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
bcd0: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
bce0: 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
bcf0: 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
bd00: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
bd10: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
bd20: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
bd30: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
bd40: 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
bd50: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
bd60: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
bd70: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
bd80: 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
bd90: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
bda0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
bdb0: 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
bdc0: 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
bdd0: 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
bde0: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
bdf0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
be00: 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
be10: 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74  then *pnOut is t
be20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
be30: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
be40: 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
be50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
be60: 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
be70: 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
be80: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
be90: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
bea0: 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
beb0: 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
bec0: 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
bed0: 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
bee0: 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
bef0: 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
bf00: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
bf10: 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
bf20: 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
bf30: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
bf40: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
bf50: 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
bf60: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
bf70: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
bf80: 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
bf90: 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
bfa0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
bfb0: 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
bfd0: 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
bfe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bff0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c000: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
c010: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
c020: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
c030: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
c040: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
c050: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
c060: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c070: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
c080: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c090: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
c0a0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
c0b0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c0c0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
c0d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c0e0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
c0f0: 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
c100: 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
c110: 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
c120: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c130: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c140: 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
c150: 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
c160: 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
c170: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c180: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
c190: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c1a0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c1b0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c1c0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c1d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
c1e0: 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  e>0 && nEq<p->nS
c1f0: 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20  ampleCol ){.    
c200: 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
c210: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
c220: 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
c230: 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
c240: 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
c250: 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
c260: 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a  .      u8 aff;..
c270: 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
c280: 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
c290: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
c2a0: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
c2b0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
c2c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
c2d0: 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  x that are less 
c2e0: 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
c2f0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c300: 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20  e query. The.   
c310: 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e     ** lower boun
c320: 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63  d being the conc
c330: 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20  atenation of $P 
c340: 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50  and $L, where $P
c350: 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
c360: 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
c370: 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
c380: 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
c390: 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
c3a0: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
c3b0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
c3c0: 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
c3d0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
c3e0: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  wer..      **.  
c3f0: 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
c400: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
c410: 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
c420: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
c430: 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
c440: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
c450: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
c460: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
c470: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c480: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
c490: 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
c4a0: 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
c4b0: 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
c4c0: 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
c4d0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24  en.      ** if $
c4e0: 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  L is available, 
c4f0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
c500: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f  is called for bo
c510: 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20  th ($P) and .   
c520: 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e     ** ($P:$L) an
c530: 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  d the larger of 
c540: 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64  the two returned
c550: 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e   values is used.
c560: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c570: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
c580: 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
c590: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
c5a0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
c5b0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
c5c0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
c5d0: 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
c5e0: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
c5f0: 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
c600: 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  ound.      ** is
c610: 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
c620: 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
c630: 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
c640: 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
c650: 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  lues.      ** of
c660: 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
c670: 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
c680: 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
c690: 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
c6a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c6b0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
c6c0: 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ows between the 
c6d0: 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68  two bounds is th
c6e0: 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69  en just iUpper-i
c6f0: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  Lower..      */.
c700: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c        tRowcnt iL
c710: 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  ower;     /* Row
c720: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c730: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
c740: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70       tRowcnt iUp
c750: 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  per;     /* Rows
c760: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
c770: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  pper bound */.  
c780: 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20      int iLwrIdx 
c790: 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -2;   /* aSamp
c7a0: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77  le[] for the low
c7b0: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
c7c0: 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20    int iUprIdx = 
c7d0: 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -1;   /* aSample
c7e0: 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72  [] for the upper
c7f0: 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20   bound */..     
c800: 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20   if( pRec ){.   
c810: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c820: 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75  Rec->nField!=pBu
c830: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c840: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63   );.        pRec
c850: 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c  ->nField = pBuil
c860: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
c870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 66        }.      af
c880: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
c890: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
c8a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45  Parse->db, p, nE
c8b0: 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q);.      assert
c8c0: 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43 6f  ( nEq!=p->nKeyCo
c8d0: 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  l || aff==SQLITE
c8e0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
c8f0: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
c900: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
c910: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
c920: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
c930: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
c940: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
c950: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
c960: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
c970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c980: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
c990: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
c9a0: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
c9b0: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
c9c0: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
c9d0: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
c9e0: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
c9f0: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
ca00: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
ca10: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
ca20: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
ca30: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
ca40: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
ca50: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
ca60: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
ca70: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
ca80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
ca90: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
caa0: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
cab0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
cac0: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
cad0: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
cae0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
caf0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cb00: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
cb10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cb20: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
cb30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
cb40: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
cb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
cb60: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
cb70: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
cb80: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
cb90: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
cba0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
cbb0: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
cbc0: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Upper);.      }.
cbd0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
cbe0: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
cbf0: 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
cc00: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
cc10: 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
cc20: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
cc30: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
cc60: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
cc70: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
cc80: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
cc90: 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
cca0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
ccb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
ccc0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
ccd0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
cce0: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
ccf0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
cd00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cd10: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
cd20: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
cd30: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
cd40: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
cd50: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
cd60: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
cd70: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
cd80: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
cd90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cda0: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
cdb0: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
cdc0: 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
cdd0: 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
cde0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
cdf0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
ce00: 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
ce10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
ce20: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
ce30: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
ce40: 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
ce50: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
ce60: 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
ce70: 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
ce80: 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cea0: 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
ceb0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
cec0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
ced0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
cee0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
cef0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
cf00: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
cf10: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
cf20: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
cf30: 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
cf40: 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
cf50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cf60: 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
cf70: 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
cf80: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
cf90: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
cfa0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
cfb0: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
cfc0: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
cfd0: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
cfe0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cff0: 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b  _GT|WO_LE)) ? a[
d000: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
d010: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
d020: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
d030: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
d040: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
d050: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
d060: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d070: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
d080: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
d090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
d0b0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
d0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
d0d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
d0e0: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
d0f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
d100: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
d110: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
d120: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
d130: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
d140: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
d150: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
d160: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
d170: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
d180: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
d190: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
d1a0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
d1b0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
d1c0: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
d1d0: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
d1e0: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
d1f0: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
d200: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
d210: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
d220: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
d230: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
d240: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
d250: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
d260: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d270: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
d280: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
d290: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
d2a0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
d2b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d2c0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
d2d0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
d2e0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
d2f0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
d300: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
d310: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
d320: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
d350: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
d360: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
d370: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d380: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
d390: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
d3a0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
d3b0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
d3c0: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
d3d0: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
d3e0: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
d3f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d400: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
d410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
d420: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
d430: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
d440: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
d450: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
d460: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
d470: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
d480: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
d490: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
d4a0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
d4b0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
d4c0: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
d4d0: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
d4e0: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
d4f0: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
d500: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
d510: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
d520: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
d530: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
d540: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
d550: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
d560: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
d570: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
d580: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
d590: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
d5a0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
d5b0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
d5c0: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
d5d0: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
d5e0: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
d5f0: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
d600: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
d610: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
d620: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
d630: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
d640: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
d650: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
d660: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
d670: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
d680: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
d690: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
d6a0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
d6b0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
d6c0: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d6d0: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
d6e0: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
d6f0: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
d700: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
d710: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
d720: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
d730: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
d740: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
d750: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
d760: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
d770: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
d780: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d790: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
d7a0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
d7b0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
d7e0: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
d7f0: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
d800: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
d810: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d820: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d830: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
d840: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
d850: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
d860: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
d870: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
d880: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
d890: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d8a0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
d8b0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
d8c0: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
d8d0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
d8e0: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
d8f0: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
d900: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
d910: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
d920: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
d930: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
d940: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
d950: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
d960: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
d970: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
d980: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
d990: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
d9a0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
d9b0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
d9c0: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
d9d0: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
d9e0: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
d9f0: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
da00: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
da10: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
da20: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
da30: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
da40: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
da50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
da60: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
da70: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
da80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
da90: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
daa0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
dab0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
dac0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
dad0: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
dae0: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
daf0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
db00: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
db10: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
db20: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
db30: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
db40: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
db50: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
db60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
db70: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
db80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
db90: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
dba0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
dbb0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
dbc0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
dbd0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
dbe0: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
dbf0: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
dc00: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
dc10: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
dc20: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
dc30: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
dc40: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
dc50: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
dc60: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
dc70: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
dc80: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
dc90: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
dca0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
dcb0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
dcc0: 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20  Rec;.  u8 aff;  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
dcf0: 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
dd20: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
dd30: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd50: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
dd60: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
dd70: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
dd80: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
dd90: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
dda0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
ddb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ddc0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
ddd0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
dde0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
ddf0: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
de00: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
de10: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
de20: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
de30: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
de40: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
de50: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
de60: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
de70: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
de80: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
de90: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
dea0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
dec0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
ded0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
dee0: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
def0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
df00: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
df10: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
df20: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
df30: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
df40: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
df50: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
df60: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
df70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df80: 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73 71  .  }..  aff = sq
df90: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
dfa0: 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d  Affinity(pParse-
dfb0: 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b 0a  >db, p, nEq-1);.
dfc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
dfd0: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
dfe0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
dff0: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
e000: 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
e010: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
e020: 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
e030: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e040: 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
e050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e060: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
e070: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e080: 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
e090: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
e0a0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
e0b0: 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
e0c0: 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79  (0x10,("equality
e0d0: 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25 73   scan regions %s
e0e0: 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20  (%d): %d\n",.   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c  p->zName, nEq-1,
e110: 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20   (int)a[1]));.  
e120: 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20  *pnRow = a[1];. 
e130: 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
e140: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e150: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e160: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64  R_STAT4 */..#ifd
e170: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e180: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
e190: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
e1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
e1b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
e1c0: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
e1d0: 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
e1e0: 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
e1f0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
e200: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
e210: 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
e220: 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
e230: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
e240: 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
e250: 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
e260: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
e270: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
e280: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
e290: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
e2a0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
e2b0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
e2c0: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
e2d0: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
e2e0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
e2f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e300: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
e310: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
e320: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
e330: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
e340: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
e350: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
e360: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
e370: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
e380: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
e390: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
e3a0: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
e3b0: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
e3c0: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
e3d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
e3e0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
e3f0: 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
e400: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e410: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
e420: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
e430: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e440: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
e450: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73  ilder,.  ExprLis
e460: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
e470: 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
e480: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
e490: 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
e4a0: 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  .)" */.  tRowcnt
e4b0: 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
e4c0: 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
e4d0: 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
e4e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
e4f0: 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
e500: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
e510: 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52  pIndex;.  i64 nR
e520: 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ow0 = sqlite3Log
e530: 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
e540: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69  wLogEst[0]);.  i
e550: 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
e560: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e570: 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
e580: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
e590: 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
e5a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
e5b0: 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
e5c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e5d0: 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
e5e0: 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
e5f0: 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
e600: 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
e610: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
e620: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
e630: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e650: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e660: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
e670: 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
e680: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e690: 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
e6a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
e6b0: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
e6c0: 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
e6d0: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
e6e0: 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
e6f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
e700: 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
e710: 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
e720: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e730: 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
e740: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
e750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e760: 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f  f( nRowEst > nRo
e770: 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e  w0 ) nRowEst = n
e780: 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  Row0;.    *pnRow
e790: 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
e7a0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
e7b0: 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
e7c0: 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52  e: est=%d\n", nR
e7d0: 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61  owEst));.  }.  a
e7e0: 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
e7f0: 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63  >nRecValid==nRec
e800: 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72  Valid );.  retur
e810: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e820: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
e830: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
e840: 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  /...#ifdef WHERE
e850: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
e860: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
e870: 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65  ntent of a Where
e880: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Term object.*/.s
e890: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
e8a0: 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54  TermPrint(WhereT
e8b0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20  erm *pTerm, int 
e8c0: 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  iTerm){.  if( pT
e8d0: 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  erm==0 ){.    sq
e8e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e8f0: 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c  ("TERM-%-3d NULL
e900: 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d  \n", iTerm);.  }
e910: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
e920: 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d  Type[4];.    mem
e930: 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22  cpy(zType, "..."
e940: 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 4);.    if( pT
e950: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
e960: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54  ERM_VIRTUAL ) zT
e970: 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20  ype[0] = 'V';.  
e980: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
e990: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
e9a0: 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20  V  ) zType[1] = 
e9b0: 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70  'E';.    if( Exp
e9c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
e9d0: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
e9e0: 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
e9f0: 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71  2] = 'L';.    sq
ea00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
ea10: 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25  (.       "TERM-%
ea20: 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72  -3d %p %s cursor
ea30: 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20  =%-3d prob=%-3d 
ea40: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
ea50: 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20  s=0x%04x\n",.   
ea60: 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d      iTerm, pTerm
ea70: 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e  , zType, pTerm->
ea80: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ea90: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20  m->truthProb,.  
eaa0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
eab0: 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74  rator, pTerm->wt
eac0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69  Flags);.    sqli
ead0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
eae0: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
eaf0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
eb00: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
eb10: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
eb20: 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
eb30: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
eb40: 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
eb50: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
eb60: 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
eb70: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
eb80: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
eb90: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
eba0: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
ebb0: 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
ebc0: 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
ebd0: 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
ebe0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ebf0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
ec00: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
ec10: 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
ec20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
ec30: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
ec40: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ec50: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
ec60: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
ec90: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
eca0: 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
ecb0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
ecc0: 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
ecf0: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
ed00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
ed10: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
ed20: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
ed30: 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
ed40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ed50: 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
ed60: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
ed70: 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
ed80: 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
ed90: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
eda0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
edb0: 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
edc0: 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
edd0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
ede0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
edf0: 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
ee00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
ee10: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
ee20: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ee30: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
ee40: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ee50: 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
ee60: 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
ee70: 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
ee80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ee90: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
eea0: 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
eeb0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
eec0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
eed0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
eee0: 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
eef0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ef00: 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
ef10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef20: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
ef30: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
ef40: 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
ef50: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
ef60: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
ef70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ef80: 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
ef90: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
efa0: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
efb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
efc0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
efd0: 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
efe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
eff0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
f000: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
f010: 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
f020: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f030: 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
f040: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
f050: 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70  >nLTerm,p->nSkip
f060: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f070: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f080: 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64  tf(" f %05x N %d
f090: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
f0a0: 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20  ->nLTerm);.  }. 
f0b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f0c0: 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
f0d0: 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
f0e0: 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
f0f0: 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  Out);.  if( p->n
f100: 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
f110: 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
f120: 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  100)!=0 ){.    i
f130: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
f140: 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20  0; i<p->nLTerm; 
f150: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
f160: 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c  eTermPrint(p->aL
f170: 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  Term[i], i);.   
f180: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
f190: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
f1a0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
f1b0: 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
f1c0: 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
f1d0: 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
f1e0: 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
f1f0: 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
f200: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
f210: 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
f220: 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
f230: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
f240: 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
f250: 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
f260: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
f270: 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
f280: 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
f290: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
f2a0: 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
f2b0: 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
f2c0: 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
f2d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f2e0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
f2f0: 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
f300: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
f310: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
f320: 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
f330: 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
f340: 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
f350: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
f360: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
f370: 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
f380: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f3a0: 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
f3b0: 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
f3c0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
f3d0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
f3e0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
f3f0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
f400: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
f410: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f420: 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
f430: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
f440: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f450: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
f460: 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
f470: 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
f480: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
f490: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
f4a0: 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
f4b0: 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
f4c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
f4d0: 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
f4e0: 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
f4f0: 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
f500: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
f510: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
f520: 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
f530: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f540: 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
f550: 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
f560: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
f570: 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
f580: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f590: 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
f5a0: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
f5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
f5c0: 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
f5d0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
f5e0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
f5f0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
f600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
f610: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
f620: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f630: 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
f640: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
f650: 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
f660: 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
f670: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
f680: 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
f690: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
f6a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
f6b0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
f6c0: 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
f6d0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
f6e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f6f0: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  PT;.  memcpy(paN
f700: 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
f710: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
f720: 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
f730: 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
f740: 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
f750: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
f760: 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
f770: 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
f780: 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
f790: 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
f7a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f7b0: 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
f7c0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
f7d0: 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
f7e0: 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
f7f0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
f800: 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
f810: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
f820: 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
f830: 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f  rom){.  whereLoo
f840: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
f850: 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72  pTo);.  if( wher
f860: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
f870: 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
f880: 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  rm) ){.    memse
f890: 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69  t(&pTo->u, 0, si
f8a0: 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20  zeof(pTo->u));. 
f8b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f8c0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
f8d0: 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70  .  memcpy(pTo, p
f8e0: 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50  From, WHERE_LOOP
f8f0: 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d  _XFER_SZ);.  mem
f900: 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c  cpy(pTo->aLTerm,
f910: 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20   pFrom->aLTerm, 
f920: 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65  pTo->nLTerm*size
f930: 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30  of(pTo->aLTerm[0
f940: 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  ]));.  if( pFrom
f950: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f960: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
f970: 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76  {.    pFrom->u.v
f980: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
f990: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
f9a0: 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
f9b0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
f9c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f  )!=0 ){.    pFro
f9d0: 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  m->u.btree.pInde
f9e0: 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  x = 0;.  }.  ret
f9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fa00: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
fa10: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
fa20: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
fa30: 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
fa40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fa50: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77  ereLoop *p){.  w
fa60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
fa70: 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , p);.  sqlite3D
fa80: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
fa90: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
faa0: 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
fab0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
fac0: 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
fad0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
fae0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
faf0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49    if( ALWAYS(pWI
fb00: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  nfo) ){.    int 
fb10: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
fb20: 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
fb30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68  ; i++){.      Wh
fb40: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
fb50: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
fb60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
fb70: 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70  el->pWLoop && (p
fb80: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
fb90: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
fba0: 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20  N_ABLE) ){.     
fbb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fbc0: 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
fbd0: 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
fbe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
fbf0: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
fc00: 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
fc10: 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  WC);.    while( 
fc20: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
fc30: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
fc40: 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
fc50: 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49  Loops;.      pWI
fc60: 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
fc70: 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
fc80: 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
fc90: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  e(db, p);.    }.
fca0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
fcb0: 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
fcc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
fcd0: 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f  rn TRUE if all o
fce0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
fcf0: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
fd00: 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65    (1)  X has the
fd10: 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
fd20: 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20  ost that Y.**   
fd30: 28 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70  (2)  X is a prop
fd40: 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a  er subset of Y.*
fd50: 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73  *   (3)  X skips
fd60: 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
fd70: 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a  y columns as Y.*
fd80: 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20  *.** By "proper 
fd90: 73 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20  subset" we mean 
fda0: 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
fdb0: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  r WHERE clause t
fdc0: 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61  erms.** than Y a
fdd0: 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
fde0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
fdf0: 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
fe00: 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a  o used.** by Y..
fe10: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20  **.** If X is a 
fe20: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
fe30: 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62   Y then Y is a b
fe40: 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64  etter choice and
fe50: 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76   ought.** to hav
fe60: 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20  e a lower cost. 
fe70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
fe80: 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20  turns TRUE when 
fe90: 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65  that cost .** re
fea0: 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e  lationship is in
feb0: 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73  verted and needs
fec0: 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e   to be adjusted.
fed0: 20 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65    The third rule
fee0: 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65  .** was added be
fef0: 63 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20  cause if X uses 
ff00: 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74  skip-scan less t
ff10: 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d  han Y it still m
ff20: 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20  ight.** deserve 
ff30: 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65  a lower cost eve
ff40: 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f  n if it is a pro
ff50: 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e  per subset of Y.
ff60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ff70: 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
ff80: 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63  roperSubset(.  c
ff90: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
ffa0: 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  pX,       /* Fir
ffb0: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  st WhereLoop to 
ffc0: 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e  compare */.  con
ffd0: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59  st WhereLoop *pY
ffe0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
fff0: 72 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  re against this 
10000 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a  WhereLoop */.){.
10010 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66    int i, j;.  if
10020 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d  ( pX->nLTerm-pX-
10030 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c  >nSkip >= pY->nL
10040 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29  Term-pY->nSkip )
10050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
10060 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75  /* X is not a su
10070 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d  bset of Y */.  }
10080 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70  .  if( pY->nSkip
10090 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72   > pX->nSkip ) r
100a0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
100b0 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72  X->rRun >= pY->r
100c0 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Run ){.    if( p
100d0 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52  X->rRun > pY->rR
100e0 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  un ) return 0;  
100f0 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
10100 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20  e than Y */.    
10110 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70  if( pX->nOut > p
10120 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e  Y->nOut ) return
10130 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
10140 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
10150 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d  .  }.  for(i=pX-
10160 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  >nLTerm-1; i>=0;
10170 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70   i--){.    if( p
10180 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20  X->aLTerm[i]==0 
10190 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
101a0 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d  for(j=pY->nLTerm
101b0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
101c0 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c        if( pY->aL
101d0 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54  Term[j]==pX->aLT
101e0 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  erm[i] ) break;.
101f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
10200 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
10210 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74  * X not a subset
10220 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d   of Y since term
10230 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62   X[i] not used b
10240 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  y Y */.  }.  ret
10250 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
10260 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
10270 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
10280 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
10290 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
102a0 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
102b0 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
102c0 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
102d0 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
102e0 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
102f0 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
10300 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
10310 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
10320 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
10330 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
10340 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
10350 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
10360 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
10370 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
10380 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
10390 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
103a0 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
103b0 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
103c0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
103d0 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
103e0 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
103f0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
10400 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
10410 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
10420 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
10430 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
10440 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
10450 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
10460 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
10470 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
10480 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
10490 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
104a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
104b0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
104c0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
104d0 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
104e0 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
104f0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
10500 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
10510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
10520 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10530 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
10540 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10550 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
10560 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
10570 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
10580 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
10590 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
105a0 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
105b0 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
105c0 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
105d0 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
105e0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
105f0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
10600 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
10610 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
10620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10630 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
10640 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
10650 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
10660 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
10670 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10680 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
10690 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
106a0 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
106b0 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
106c0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
106d0 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
106e0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
106f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
10700 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
10710 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
10720 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
10730 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
10740 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
10750 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10760 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
10770 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
10780 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
10790 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
107a0 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
107d0 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
107e0 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
107f0 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
10800 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10810 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
10820 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
10830 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
10840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10850 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
10860 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
10870 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
10880 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
10890 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70  at can be.** sup
108a0 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70  planted by pTemp
108b0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  late..**.** Retu
108c0 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57  rn NULL if the W
108d0 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f  hereLoop list co
108e0 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20  ntains an entry 
108f0 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e  that can supplan
10900 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20  t.** pTemplate, 
10910 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
10920 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73  f pTemplate does
10930 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74   not belong on t
10940 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  he list..**.** I
10950 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
10960 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
10970 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c  te can supplant,
10980 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
10990 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f  .** link that po
109a0 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a  ints to pX..**.*
109b0 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63  * If pTemplate c
109c0 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61  annot supplant a
109d0 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d  ny existing elem
109e0 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ent of the list 
109f0 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  but needs.** to 
10a00 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10a10 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72  list, then retur
10a20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
10a30 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  he tail of the l
10a40 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
10a50 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
10a60 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
10a70 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
10a80 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
10a90 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
10aa0 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
10ab0 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
10ac0 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
10ad0 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
10ae0 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
10af0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
10b00 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
10b10 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
10b20 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
10b30 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
10b40 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
10b50 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
10b60 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
10b70 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
10b80 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
10b90 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
10ba0 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
10bb0 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
10bc0 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
10bd0 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
10be0 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
10bf0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
10c00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
10c10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
10c20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
10c30 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
10c40 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
10c50 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
10c60 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
10c70 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
10c80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
10c90 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
10ca0 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
10cb0 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
10cc0 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
10cd0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
10ce0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
10cf0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
10d00 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
10d10 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
10d20 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
10d30 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
10d40 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
10d50 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
10d60 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
10d70 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
10d80 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
10d90 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
10da0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
10db0 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
10dc0 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
10dd0 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
10de0 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
10df0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
10e00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
10e10 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
10e20 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
10e30 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
10e40 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
10e50 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
10e60 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
10e70 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
10e80 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
10e90 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
10ea0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
10eb0 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
10ec0 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
10ed0 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
10ee0 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
10ef0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
10f00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10f10 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
10f20 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10f30 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
10f40 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10f50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10f60 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
10f70 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10f80 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10f90 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
10fa0 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
10fb0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
10fc0 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
10fd0 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
10fe0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
10ff0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11000 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11010 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
11020 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
11030 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
11040 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
11050 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
11060 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
11070 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
11080 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
11090 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
110a0 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
110b0 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
110c0 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
110d0 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
110e0 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
110f0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11100 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11110 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
11120 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
11130 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
11140 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
11170 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
11180 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
111b0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
111c0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
111f0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
11200 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
11210 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
11220 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11230 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
11240 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
11250 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
11260 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
11270 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
11280 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
11290 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
112a0 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
112b0 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
112c0 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
112d0 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
112e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
112f0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
11300 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
11310 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
11320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
11330 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
11340 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
11350 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11360 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
11370 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
11380 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
113b0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
113c0 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
113d0 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
11400 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
11410 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
11420 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11430 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
11440 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
11450 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
11460 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
11470 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
11480 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
11490 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
114a0 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
114b0 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
114c0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
114d0 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
114e0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
114f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
11500 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
11510 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
11520 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
11530 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
11540 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
11550 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
11560 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
11570 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
11580 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
11590 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
115a0 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
115b0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
115c0 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
115d0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
115e0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
115f0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
11600 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
11610 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
11620 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
11630 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
11640 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
11650 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
11660 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
11670 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
11680 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
11690 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
116a0 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
116b0 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
116c0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
116d0 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
116e0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
116f0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
11700 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
11710 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
11720 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
11730 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
11740 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
11750 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
11760 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
11770 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
11780 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
11790 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
117a0 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
117b0 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
117c0 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
117d0 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
117e0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
117f0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11800 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
11810 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
11820 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
11830 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
11840 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
11850 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
11860 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
11870 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
11880 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
11890 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
118a0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
118b0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
118c0 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
118d0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
118e0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
118f0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
11900 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
11910 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
11920 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
11930 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
11940 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
11950 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
11960 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
11970 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
11980 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
11990 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
119a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
119b0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
119c0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
119d0 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
119e0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
119f0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
11a00 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
11a10 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
11a20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
11a30 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
11a40 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69  rSet!=0 ){.    i
11a50 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  f( pTemplate->nL
11a60 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52  Term ){.#if WHER
11a70 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
11a80 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75       u16 n = pBu
11a90 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e  ilder->pOrSet->n
11aa0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a  ;.      int x =.
11ab0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
11ac0 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
11ad0 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
11ae0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
11af0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
11b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11b30 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
11b40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
11b50 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
11b60 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
11b70 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
11b80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
11b90 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
11ba0 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
11bb0 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
11bc0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11bd0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
11be0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11bf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
11c00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11c10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
11c20 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
11c30 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
11c40 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
11c50 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
11c60 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
11c70 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
11c80 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
11c90 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
11ca0 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
11cb0 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
11cc0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
11cd0 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
11ce0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
11cf0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
11d00 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
11d10 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
11d20 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
11d30 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
11d40 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
11d50 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
11d60 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
11d70 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
11d80 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
11d90 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
11da0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
11db0 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29  ntf("   skip: ")
11dc0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
11dd0 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
11de0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
11df0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11e10 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
11e20 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
11e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
11e40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
11e50 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
11e60 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
11e70 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
11e80 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
11e90 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
11ea0 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
11eb0 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
11ec0 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
11ed0 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
11ee0 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
11ef0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11f00 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
11f10 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
11f20 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
11f30 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
11f40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11f50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20  rintf("replace: 
11f60 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
11f70 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
11f80 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11f90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
11fa0 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61 64  ugPrintf("    ad
11fb0 64 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  d: ");.    where
11fc0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11fd0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11fe0 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
11ff0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
12000 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
12010 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  new WhereLoop to
12020 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20   add to the end 
12030 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  of the list */. 
12040 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d     *ppPrev = p =
12050 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
12060 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
12070 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
12080 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
12090 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
120a0 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65  _BKPT;.    where
120b0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
120c0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
120d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
120e0 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
120f0 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
12100 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
12110 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
12120 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
12130 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
12140 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
12150 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
12160 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
12170 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
12180 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
12190 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
121a0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
121b0 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
121c0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
121d0 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
121e0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
121f0 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
12200 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
12210 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
12220 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
12230 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30     if( ppTail==0
12240 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12250 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c  pToDel = *ppTail
12260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44  ;.      if( pToD
12270 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  el==0 ) break;. 
12280 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70       *ppTail = p
12290 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ToDel->pNextLoop
122a0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
122b0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
122c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
122d0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
122e0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
122f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12300 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b  tf(" delete: ");
12310 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
12320 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20  opPrint(pToDel, 
12330 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12340 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
12350 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
12360 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29  lete(db, pToDel)
12370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
12380 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72   = whereLoopXfer
12390 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
123a0 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
123b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
123c0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
123d0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
123e0 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
123f0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
12400 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
12410 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
12420 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
12430 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
12440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
12460 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  t the WhereLoop.
12470 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77  nOut value downw
12480 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ard to account f
12490 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  or terms of the.
124a0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
124b0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
124c0 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63  he loop but whic
124d0 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62  h are not used b
124e0 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  y an.** index..*
124f0 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48  .** For every WH
12500 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12510 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12520 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12530 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61   and which has a
12540 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12550 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f  ty assigned by o
12560 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69  ne of the likeli
12570 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c  hood(),.** likel
12580 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79  y(), or unlikely
12590 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
125a0 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74  , reduce the est
125b0 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a  imated number.**
125c0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
125d0 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  by the probabili
125e0 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ty specified..**
125f0 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72  .** TUNING:  For
12600 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
12610 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73  use term that is
12620 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
12630 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68   index.** and wh
12640 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ich does not hav
12650 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72  e an assigned tr
12660 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c  uth probability,
12670 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64   heuristics.** d
12680 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61  escribed below a
12690 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74  re used to try t
126a0 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74  o estimate the t
126b0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
126c0 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65  ..** TODO --> Pe
126d0 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f  rhaps this is so
126e0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75  mething that cou
126f0 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62  ld be improved b
12700 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c  y better.** tabl
12710 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a  e statistics..**
12720 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a  .** Heuristic 1:
12730 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74    Estimate the t
12740 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12750 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65   as 93.75%.  The
12760 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65   93.75%.** value
12770 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
12780 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74  -1 in LogEst not
12790 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d  ation, so this m
127a0 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a  eans decrement.*
127b0 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  * the WhereLoop.
127c0 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65  nOut field for e
127d0 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20  very such WHERE 
127e0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a  clause term..**.
127f0 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20  ** Heuristic 2: 
12800 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
12810 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
12820 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
12830 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22  of the.** form "
12840 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50  x==EXPR" and EXP
12850 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  R is not a const
12860 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e  ant 0 or 1, then
12870 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a   make sure the.*
12880 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72  * final output r
12890 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e  ow estimate is n
128a0 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  o greater than 1
128b0 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  /4 of the total 
128c0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
128d0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
128e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
128f0 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d   assume that x==
12900 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72  EXPR will filter
12910 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74  .** out at least
12920 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73   3 out of 4 rows
12930 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31  .  If EXPR is -1
12940 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   or 0 or 1, then
12950 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78   maybe the.** "x
12960 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c  " column is bool
12970 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f  ean or else -1 o
12980 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f  r 0 or 1 is a co
12990 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c  mmon default val
129a0 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22  ue.** on the "x"
129b0 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69   column and so i
129c0 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
129d0 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20   cap the output 
129e0 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20  row estimate.** 
129f0 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f  at 1/2 instead o
12a00 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  f 1/4..*/.static
12a10 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f   void whereLoopO
12a20 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57  utputAdjust(.  W
12a30 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
12a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
12a50 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
12a60 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
12a70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
12a80 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e  p to adjust down
12a90 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ward */.  LogEst
12aa0 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20   nRow           
12ab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
12ac0 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ws in the entire
12ad0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
12ae0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
12af0 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20   *pX;.  Bitmask 
12b00 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70  notAllowed = ~(p
12b10 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f  Loop->prereq|pLo
12b20 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20  op->maskSelf);. 
12b30 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
12b40 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d  LogEst iReduce =
12b50 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d   0;    /* pLoop-
12b60 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74  >nOut should not
12b70 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65   exceed nRow-iRe
12b80 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  duce */..  asser
12b90 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
12ba0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
12bb0 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66  INDEX)==0 );.  f
12bc0 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c  or(i=pWC->nTerm,
12bd0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
12be0 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; i--, pTerm++
12bf0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
12c00 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
12c10 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20  M_VIRTUAL)!=0 ) 
12c20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28  break;.    if( (
12c30 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
12c40 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
12c50 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  lf)==0 ) continu
12c60 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
12c70 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
12c80 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20  otAllowed)!=0 ) 
12c90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
12ca0 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  r(j=pLoop->nLTer
12cb0 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  m-1; j>=0; j--){
12cc0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f  .      pX = pLoo
12cd0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
12ce0 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20      if( pX==0 ) 
12cf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12d00 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20  if( pX==pTerm ) 
12d10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
12d20 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20   pX->iParent>=0 
12d30 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e  && (&pWC->a[pX->
12d40 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d  iParent])==pTerm
12d50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
12d60 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
12d70 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12d80 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
12d90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
12da0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12db0 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75  y is specified u
12dc0 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68  sing the likelih
12dd0 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20  ood() hints,.   
12de0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
12df0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
12e00 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
12e10 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f   application. */
12e20 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
12e30 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
12e40 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
12e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
12e60 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
12e70 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75   of explicit tru
12e80 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73  th probabilities
12e90 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73  , use heuristics
12ea0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67   to.        ** g
12eb0 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c  uess a reasonabl
12ec0 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
12ed0 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
12ee0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20  pLoop->nOut--;. 
12ef0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
12f00 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
12f10 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
12f20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69         Expr *pRi
12f30 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
12f40 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
12f50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12f60 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
12f70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
12f80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12f90 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52  ExprIsInteger(pR
12fa0 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d  ight, &k) && k>=
12fb0 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a  (-1) && k<=1 ){.
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20              k = 
12fd0 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  10;.          }e
12fe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
12ff0 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20   k = 20;.       
13000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
13010 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69  f( iReduce<k ) i
13020 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20  Reduce = k;.    
13030 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13040 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
13050 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77  oop->nOut > nRow
13060 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f  -iReduce )  pLoo
13070 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d  p->nOut = nRow -
13080 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a   iReduce;.}../*.
13090 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f  ** Adjust the co
130a0 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74  st C by the cost
130b0 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20  Mult facter T.  
130c0 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73  This only occurs
130d0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20   if.** compiled 
130e0 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e  with -DSQLITE_EN
130f0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f  ABLE_COSTMULT.*/
13100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13110 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23  NABLE_COSTMULT.#
13120 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
13130 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
13140 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23    C += T.#else.#
13150 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
13160 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
13170 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
13180 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
13190 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
131a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
131b0 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a  q terms of the .
131c0 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e  ** index pIndex.
131d0 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
131e0 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  e more..**.** Wh
131f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13200 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69   is called, pBui
13210 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74  lder->pNew->nOut
13220 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a   contains the .*
13230 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
13240 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
13250 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65  visited by filte
13260 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e  ring using the n
13270 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  Eq .** terms onl
13280 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69  y. If it is modi
13290 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65  fied, this value
132a0 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66   is restored bef
132b0 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
132c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
132d0 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
132e0 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
132f0 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
13300 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
13310 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
13320 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
13330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
13340 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
13350 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
13360 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
13370 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
13380 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
13390 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
133a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
133b0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
133c0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
133d0 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
133e0 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13400 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
13410 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49  c */.  LogEst nI
13420 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
13430 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
13440 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
13450 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
13460 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
13470 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
13480 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
13490 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
134a0 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
134b0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
134c0 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
134d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
134e0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
134f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13500 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
13510 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13520 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
13530 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
13540 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
13550 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
13560 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
13570 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13580 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13590 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
135a0 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
135b0 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
135c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
135d0 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
135e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
135f0 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
13600 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
13610 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
13620 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
13630 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
13640 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
13650 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
13660 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
13670 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
13680 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
13690 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
136a0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
136b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
136c0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
136d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
136e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b    u16 saved_nEq;
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13710 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
13720 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31  tree.nEq */.  u1
13730 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13750 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
13760 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
13770 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
13780 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
13790 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
137a0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
137b0 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
137c0 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
137d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
137e0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
137f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
13800 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13810 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
13820 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13830 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
13840 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13850 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13860 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
13870 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
13880 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
13890 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
138a0 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
138b0 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
138c0 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
138d0 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
138e0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
138f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13900 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
13910 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
13920 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13930 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13940 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20  _NOMEM_BKPT;..  
13950 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
13960 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
13970 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
13980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
13990 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
139a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
139b0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
139c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
139d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
139e0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
139f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
13a00 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e  if( /*pProbe->tn
13a10 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63  um<=0 ||*/ (pSrc
13a20 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
13a30 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
13a40 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
13a50 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
13a60 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
13a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
13a80 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
13a90 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
13aa0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
13ab0 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
13ac0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
13ad0 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
13ae0 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
13af0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
13b00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
13b10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
13b20 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
13b30 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ..  saved_nEq = 
13b40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
13b50 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
13b60 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
13b70 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
13b80 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
13b90 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
13ba0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
13bb0 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
13bc0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
13bd0 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
13be0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72  ew->nOut;.  pTer
13bf0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
13c00 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
13c10 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
13c20 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71  ursor, saved_nEq
13c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13c40 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
13c50 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65  , pProbe);.  pNe
13c60 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
13c70 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
13c80 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
13c90 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
13ca0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66  tLog(rSize);.  f
13cb0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
13cd0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
13ce0 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
13cf0 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65     u16 eOp = pTe
13d00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20  rm->eOperator;  
13d10 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
13d20 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  r pTerm->eOperat
13d30 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  or */.    LogEst
13d40 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c   rCostIdx;.    L
13d50 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75  ogEst nOutUnadju
13d60 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  sted;        /* 
13d70 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29  nOut before IN()
13d80 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73   and WHERE adjus
13d90 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  tments */.    in
13da0 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
13db0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13dc0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
13dd0 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
13de0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
13df0 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
13e00 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f     if( (eOp==WO_
13e10 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d  ISNULL || (pTerm
13e20 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56  ->wtFlags&TERM_V
13e30 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26  NULL)!=0).     &
13e40 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  & indexColumnNot
13e50 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76  Null(pProbe, sav
13e60 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ed_nEq).    ){. 
13e70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
13e80 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
13e90 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
13ea0 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
13eb0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
13ec0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
13ed0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
13ee0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
13ef0 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
13f00 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
13f10 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
13f20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
13f30 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
13f40 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
13f50 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
13f60 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
13f70 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
13f80 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
13f90 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
13fa0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
13fb0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
13fc0 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
13fd0 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  e;..    pNew->ws
13fe0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
13ff0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
14000 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
14010 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
14020 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
14030 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
14040 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
14050 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
14060 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
14070 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
14080 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
14090 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
140a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
140b0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
140c0 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
140d0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
140e0 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
140f0 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  lf;..    assert(
14100 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
14110 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
14120 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
14130 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20  UMN_NULL)!=0 .  
14140 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
14150 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14160 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20  COLUMN_IN)!=0 . 
14170 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
14180 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14190 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20  _SKIPSCAN)!=0 . 
141a0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65     );..    if( e
141b0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  Op & WO_IN ){.  
141c0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
141d0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
141e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
141f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14200 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
14210 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14220 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14230 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
14240 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
14250 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
14260 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
14270 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
14280 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
14290 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
142a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
142b0 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
142c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
142d0 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
142e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
142f0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
14300 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
14310 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
14320 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
14330 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
14340 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
14350 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
14360 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
14370 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
14380 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
14390 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
143a0 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
143c0 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
143d0 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
143e0 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  */..    }else if
143f0 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57  ( eOp & (WO_EQ|W
14400 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
14410 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  nt iCol = pProbe
14420 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
14430 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65  _nEq];.      pNe
14440 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
14450 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
14460 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76       assert( sav
14470 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e  ed_nEq==pNew->u.
14480 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20  btree.nEq );.   
14490 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f     if( iCol==XN_
144a0 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c  ROWID .       ||
144b0 20 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d   (iCol>0 && nInM
144c0 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e  ul==0 && saved_n
144d0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
144e0 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  Col-1).      ){.
144f0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
14500 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75  >=0 && pProbe->u
14510 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  niqNotNull==0 ){
14520 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
14530 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14540 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
14550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14560 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
14570 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
14580 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
14590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
145a0 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
145b0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
145c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
145d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
145e0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
145f0 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
14600 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
14610 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14620 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
14630 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14640 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
14650 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14660 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
14670 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
14680 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
14690 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
146a0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
146b0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
146c0 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
146d0 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
146e0 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
146f0 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
14700 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
14710 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
14720 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
14730 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
14740 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
14750 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
14760 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
14770 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
14780 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
14790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
147a0 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
147b0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
147c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
147d0 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
147e0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
147f0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
14800 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
14810 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
14820 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
14830 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
14840 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
14850 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
14860 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
14870 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
14880 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d  P_LIMIT;.      }
14890 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
148a0 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
148b0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
148c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
148d0 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
148e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
148f0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
14900 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14910 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
14920 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
14930 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
14940 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
14950 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
14960 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
14970 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
14980 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
14990 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
149a0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
149b0 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
149c0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
149d0 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
149e0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
149f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
14a00 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
14a10 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
14a20 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
14a30 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
14a40 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
14a50 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
14a60 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
14a70 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
14a80 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
14a90 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
14aa0 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
14ab0 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
14ac0 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
14ad0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
14ae0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
14af0 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
14b00 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
14b10 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
14b20 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
14b30 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
14b40 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
14b50 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
14b60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14b70 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14b80 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
14b90 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
14ba0 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
14bb0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
14bc0 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
14bd0 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
14be0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
14bf0 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
14c00 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
14c10 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
14c20 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
14c30 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
14c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
14c50 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
14c60 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
14c70 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
14c80 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
14c90 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20  N|WO_IS) );..   
14ca0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
14cb0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
14cc0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14cd0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14ce0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69  =0 && pProbe->ai
14cf0 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
14d00 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]>=0 ){.        
14d10 61 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57  assert( (eOp & W
14d20 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20  O_IN) || nIn==0 
14d30 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
14d40 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e  ase( eOp & WO_IN
14d50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
14d60 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
14d70 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
14d80 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
14d90 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  = nIn;.      }el
14da0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
14db0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
14dc0 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20  R_STAT4.        
14dd0 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
14de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49  ;.        if( nI
14df0 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20  nMul==0 .       
14e00 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
14e10 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26  mple .         &
14e20 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
14e30 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61  nEq<=pProbe->nSa
14e40 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20  mpleCol.        
14e50 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49   && ((eOp & WO_I
14e60 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61  N)==0 || !ExprHa
14e70 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14e80 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
14e90 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29  lect)).        )
14ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
14eb0 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
14ec0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
14ed0 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f    if( (eOp & (WO
14ee0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
14ef0 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IS))!=0 ){.    
14f00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14f10 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
14f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
14f30 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14f40 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IS );.          
14f50 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14f60 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
14f70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
14f80 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
14f90 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
14fa0 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  er, pExpr->pRigh
14fb0 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
14fc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
14fe0 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
14ff0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
15000 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
15010 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
15020 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
15030 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
15040 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
15050 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
15060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15070 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20  K ) break;      
15080 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20      /* Jump out 
15090 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f  of the pTerm loo
150a0 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  p */.          i
150b0 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  f( nOut ){.     
150c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
150d0 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
150e0 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  t(nOut);.       
150f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e       if( pNew->n
15100 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29  Out>saved_nOut )
15110 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15120 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20  ved_nOut;.      
15130 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15140 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20   -= nIn;.       
15150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15160 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d         if( nOut=
15170 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  =0 ).#endif.    
15180 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
15190 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70  pNew->nOut += (p
151a0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
151b0 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  st[nEq] - pProbe
151c0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
151d0 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  q-1]);.         
151e0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
151f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
15200 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49      /* TUNING: I
15210 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
15220 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
15230 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20  , assume that a 
15240 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
15250 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78  "col IS NULL" ex
15260 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73  pression matches
15270 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72   twice as many r
15280 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ows .           
15290 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20   ** as (col=?). 
152a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
152b0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b  New->nOut += 10;
152c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
152d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
152e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
152f0 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65   rCostIdx to the
15300 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
15310 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20  g selected rows 
15320 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20  in index. Add.  
15330 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d    ** it to pNew-
15340 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20  >rRun, which is 
15350 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
15360 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
15370 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65   index.    ** se
15380 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69  ek only. Then, i
15390 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
153a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
153b0 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a  add the cost of.
153c0 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20      ** visiting 
153d0 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
153e0 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  main table.  */.
153f0 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70      rCostIdx = p
15400 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20  New->nOut + 1 + 
15410 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
15420 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62  xRow)/pSrc->pTab
15430 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
15440 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
15450 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
15460 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78  ogSize, rCostIdx
15470 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  );.    if( (pNew
15480 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
15490 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
154a0 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20  E_IPK))==0 ){.  
154b0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
154c0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
154d0 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e  d(pNew->rRun, pN
154e0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a  ew->nOut + 16);.
154f0 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43      }.    ApplyC
15500 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
15510 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65  ew->rRun, pProbe
15520 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75  ->pTable->costMu
15530 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e  lt);..    nOutUn
15540 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d  adjusted = pNew-
15550 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  >nOut;.    pNew-
15560 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >rRun += nInMul 
15570 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d  + nIn;.    pNew-
15580 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >nOut += nInMul 
15590 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65  + nIn;.    where
155a0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
155b0 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
155c0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
155d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
155e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
155f0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
15600 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
15610 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
15620 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  NGE ){.      pNe
15630 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
15640 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nOut;.    }else{
15650 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
15660 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  t = nOutUnadjust
15670 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ed;.    }..    i
15680 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
15690 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
156a0 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  MIT)==0.     && 
156b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
156c0 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
156d0 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  n.    ){.      w
156e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
156f0 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
15700 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
15710 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
15720 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
15730 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69  = saved_nOut;.#i
15740 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15750 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
15760 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  4.    pBuilder->
15770 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
15780 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
15790 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  }.  pNew->prereq
157a0 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b   = saved_prereq;
157b0 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
157c0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
157d0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
157e0 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
157f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
15800 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
15810 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
15820 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
15830 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
15840 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
15850 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
15860 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
15870 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
15880 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
15890 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
158a0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
158b0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
158c0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
158d0 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
158e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
158f0 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
15900 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
15910 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
15920 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
15930 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
15940 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
15950 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
15960 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
15970 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
15980 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
15990 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
159a0 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
159b0 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
159c0 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
159d0 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
159e0 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
159f0 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
15a00 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
15a10 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
15a20 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
15a30 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
15a40 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
15a50 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
15a60 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
15a70 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
15a80 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
15a90 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
15aa0 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
15ab0 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
15ac0 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
15ad0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
15ae0 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
15af0 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
15b00 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
15b10 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
15b20 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72  can==0.   && pPr
15b30 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15b40 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
15b50 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
15b60 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
15b70 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
15b80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
15b90 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
15ba0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
15bb0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
15bc0 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
15bd0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15be0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
15bf0 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
15c00 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
15c10 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
15c20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
15c30 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
15c40 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
15c50 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
15c60 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15c70 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
15c80 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
15c90 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
15ca0 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
15cb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
15cc0 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
15cd0 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
15ce0 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
15cf0 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
15d00 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
15d10 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
15d20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
15d30 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
15d40 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
15d50 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
15d60 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
15d70 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
15d80 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
15d90 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
15da0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
15db0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
15dc0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
15dd0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
15de0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
15df0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
15e00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
15e10 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
15e20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
15e30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15e40 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f  True if it is po
15e50 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64  ssible that pInd
15e60 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66  ex might be usef
15e70 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ul in.** impleme
15e80 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
15e90 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75  BY clause in pBu
15ea0 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ilder..**.** Ret
15eb0 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75  urn False if pBu
15ec0 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63  ilder does not c
15ed0 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20  ontain an ORDER 
15ee0 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20  BY clause or.** 
15ef0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
15f00 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f  ay for pIndex to
15f10 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d   be useful in im
15f20 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a  plementing that.
15f30 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
15f40 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
15f50 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  t indexMightHelp
15f60 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57  WithOrderBy(.  W
15f70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
15f80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64  *pBuilder,.  Ind
15f90 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e  ex *pIndex,.  in
15fa0 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45  t iCursor.){.  E
15fb0 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20  xprList *pOB;.  
15fc0 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78  ExprList *aColEx
15fd0 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  pr;.  int ii, jj
15fe0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
15ff0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
16000 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
16010 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
16020 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
16030 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16040 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
16050 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
16060 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
16070 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
16080 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
16090 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
160a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
160b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
160c0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
160d0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66  rsor ){.      if
160e0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
160f0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
16100 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
16110 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  j<pIndex->nKeyCo
16120 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  l; jj++){.      
16130 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
16140 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69  lumn==pIndex->ai
16150 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74  Column[jj] ) ret
16160 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
16170 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43     }else if( (aC
16180 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d  olExpr = pIndex-
16190 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b  >aColExpr)!=0 ){
161a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
161b0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
161c0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
161d0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
161e0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e  aiColumn[jj]!=XN
161f0 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65  _EXPR ) continue
16200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
16210 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
16220 28 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d  (pExpr,aColExpr-
16230 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75  >a[jj].pExpr,iCu
16240 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rsor)==0 ){.    
16250 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
16260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16270 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
16280 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16290 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73   Return a bitmas
162a0 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63  k where 1s indic
162b0 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72  ate that the cor
162c0 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
162d0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  n of.** the tabl
162e0 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20  e is used by an 
162f0 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
16300 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
16310 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
16320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
16330 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64  ask columnsInInd
16340 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  ex(Index *pIdx){
16350 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30  .  Bitmask m = 0
16360 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
16370 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (j=pIdx->nColumn
16380 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
16390 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
163a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
163b0 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
163c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
163d0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
163e0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
163f0 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-2 );.      if(
16400 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
16410 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20  MASKBIT(x);.    
16420 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
16430 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
16440 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
16450 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
16460 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
16470 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
16480 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
16490 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
164a0 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
164b0 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
164c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
164d0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
164e0 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
164f0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
16500 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
16510 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
16520 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68  erm *pTerm;.  wh
16530 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
16540 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69  =TK_AND ){.    i
16550 66 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  f( !whereUsableP
16560 61 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62  artialIndex(iTab
16570 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65  ,pWC,pWhere->pLe
16580 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
16590 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
165a0 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  ere->pRight;.  }
165b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
165c0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
165d0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
165e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
165f0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
16600 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
16610 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
16620 73 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68  sExpr(pExpr, pWh
16630 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20  ere, iTab) .    
16640 20 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f   && (!ExprHasPro
16650 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16660 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78  FromJoin) || pEx
16670 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
16680 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29  ble==iTab).    )
16690 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
166a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
166b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
166c0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
166d0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
166e0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
166f0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
16700 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
16710 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
16720 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
16730 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
16740 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
16750 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
16760 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
16770 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
16780 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
16790 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
167a0 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
167b0 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
167c0 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
167d0 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
167e0 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
167f0 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
16800 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
16810 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
16820 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
16830 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
16840 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
16850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
16860 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
16870 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16880 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
16890 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
168a0 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
168b0 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
168c0 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
168d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
168e0 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
168f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
16900 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
16910 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
16920 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
16930 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
16940 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
16950 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
16960 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
16970 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
16980 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
16990 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
169a0 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
169b0 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
169c0 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
169d0 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
169e0 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
169f0 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
16a00 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
16a10 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
16a20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
16a30 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
16a40 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
16a50 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
16a60 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
16a70 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
16a80 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
16a90 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
16aa0 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
16ab0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
16ac0 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
16ad0 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
16ae0 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
16af0 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
16b00 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
16b10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
16b20 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
16b30 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
16b40 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
16b50 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
16b60 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
16b70 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
16b80 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
16b90 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
16ba0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
16bb0 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
16bc0 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
16bd0 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
16be0 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
16bf0 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
16c00 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
16c10 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
16c20 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
16c30 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
16c40 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
16c50 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
16c60 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
16c70 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
16c80 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
16c90 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
16ca0 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
16cb0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
16cc0 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
16cd0 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
16ce0 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
16cf0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
16d00 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
16d10 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
16d20 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
16d30 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
16d40 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
16d50 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
16d60 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
16d70 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
16d80 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
16d90 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
16da0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
16db0 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
16dc0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
16dd0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
16de0 61 73 6b 20 6d 50 72 65 72 65 71 20 20 20 20 20  ask mPrereq     
16df0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
16e00 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
16e10 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
16e20 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
16e30 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
16e40 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
16e50 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
16e60 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
16e70 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
16e80 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
16e90 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
16ea0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
16ed0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
16ee0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
16ef0 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
16f00 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
16f10 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
16f20 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
16f30 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
16f40 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
16f50 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
16f60 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
16f70 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
16f80 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
16f90 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
16fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
16fb0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
16fc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
16fd0 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
16fe0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
16ff0 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
17000 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
17010 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
17020 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
17030 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
17040 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17050 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
17060 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17070 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
17080 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
17090 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
170a0 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
170c0 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
170d0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
170e0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
170f0 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
17100 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17110 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
17120 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
17130 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
17140 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
17150 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
17160 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
17170 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
17180 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17190 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
171a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
171d0 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
171e0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
171f0 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
17200 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17210 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
17220 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
17230 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
17240 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
17250 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
17260 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
17270 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
17280 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
17290 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
172a0 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
172b0 2d 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20  ->pIBIndex ){.  
172c0 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
172d0 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
172e0 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
172f0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
17300 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53  .    pProbe = pS
17310 72 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20  rc->pIBIndex;.  
17320 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f  }else if( !HasRo
17330 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
17340 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e   pProbe = pTab->
17350 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
17360 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
17370 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
17380 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
17390 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
173a0 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
173b0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
173c0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
173d0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
173e0 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
173f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
17400 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
17410 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
17420 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
17430 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
17440 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
17450 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
17460 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
17490 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
174a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
174b0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
174c0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
174d0 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d     sPk.nKeyCol =
174e0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c   1;.    sPk.nCol
174f0 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
17500 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
17510 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
17520 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61  .aiRowLogEst = a
17530 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
17540 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
17550 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
17560 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  .pTable = pTab;.
17570 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77      sPk.szIdxRow
17580 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f   = pTab->szTabRo
17590 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  w;.    aiRowEstP
175a0 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  k[0] = pTab->nRo
175b0 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52  wLogEst;.    aiR
175c0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a  owEstPk[1] = 0;.
175d0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
175e0 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
175f0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66  .    if( pSrc->f
17600 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
17610 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
17620 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
17630 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
17640 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
17650 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
17660 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
17670 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
17680 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
17690 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
176a0 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
176b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
176c0 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20  e = &sPk;.  }.  
176d0 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52  rSize = pTab->nR
176e0 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67  owLogEst;.  rLog
176f0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
17700 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ize);..#ifndef S
17710 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
17720 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20  ATIC_INDEX.  /* 
17730 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
17740 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
17750 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20  lder->pOrSet    
17760 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66    /* Not part of
17770 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74   an OR optimizat
17780 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57  ion */.   && (pW
17790 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
177a0 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f   & WHERE_NO_AUTO
177b0 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20  INDEX)==0.   && 
177c0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
177d0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
177e0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
177f0 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
17800 42 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f  BIndex==0      /
17810 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44  * Has no INDEXED
17820 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
17830 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f   && !pSrc->fg.no
17840 74 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61  tIndexed   /* Ha
17850 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
17860 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
17870 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
17880 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57          /* Not W
17890 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
178a0 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20  le. (FIXME: Why 
178b0 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21  not?) */.   && !
178c0 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65  pSrc->fg.isCorre
178d0 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63  lated /* Not a c
178e0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
178f0 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ry */.   && !pSr
17900 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  c->fg.isRecursiv
17910 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75  e  /* Not a recu
17920 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  rsive common tab
17930 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  le expression. *
17940 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  /.  ){.    /* Ge
17950 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
17960 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
17970 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
17980 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
17990 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
179a0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
179b0 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
179c0 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
179d0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
179e0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
179f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
17a00 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
17a10 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
17a20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17a30 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
17a40 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
17a50 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
17a60 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
17a70 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
17a80 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
17a90 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
17aa0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
17ab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
17ac0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
17ad0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
17ae0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
17af0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
17b00 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
17b10 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
17b20 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
17b30 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
17b40 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
17b50 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   X*N*log2(N) whe
17b60 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
17b70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
17b80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
17b90 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
17ba0 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20   and where X is 
17bb0 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f  7 (LogEst=28) fo
17bc0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20  r normal.       
17bd0 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e   ** tables or 1.
17be0 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66  375 (LogEst=4) f
17bf0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
17c00 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61  queries.  The va
17c10 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  lue.        ** o
17c20 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66  f X is smaller f
17c30 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
17c40 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20  queries so that 
17c50 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
17c60 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  r.        ** wil
17c70 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73  l be more aggres
17c80 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72  sive about gener
17c90 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20  ating automatic 
17ca0 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20  indexes for.    
17cb0 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a      ** those obj
17cc0 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72  ects, since ther
17cd0 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e  e is no opportun
17ce0 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d  ity to add schem
17cf0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  a.        ** ind
17d00 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69  exes on subqueri
17d10 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f  es and views. */
17d20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
17d30 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
17d40 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20   + rSize + 4;.  
17d50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
17d60 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70  pSelect==0 && (p
17d70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
17d80 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
17d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
17da0 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34  ew->rSetup += 24
17db0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17dc0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
17dd0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53  tiplier(pNew->rS
17de0 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74  etup, pTab->cost
17df0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  Mult);.        /
17e00 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
17e10 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
17e20 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
17e30 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
17e40 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
17e50 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
17e60 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
17e70 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
17e80 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
17e90 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
17ea0 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
17eb0 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
17ec0 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
17ed0 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
17ee0 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
17ef0 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
17f00 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
17f10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
17f20 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
17f30 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
17f40 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
17f50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
17f60 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
17f70 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
17f80 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
17f90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17fa0 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
17fb0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
17fc0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
17fd0 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
17fe0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
17ff0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
18000 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
18010 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
18020 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
18030 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18040 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
18050 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
18060 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
18070 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
18080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18090 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
180a0 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
180b0 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
180c0 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
180d0 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
180e0 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
180f0 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
18100 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
18110 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
18120 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
18130 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
18140 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
18150 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
18160 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
18170 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
18180 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
18190 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
181a0 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
181b0 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
181c0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
181d0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
181e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
181f0 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
18200 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
18210 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
18220 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
18230 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
18240 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
18250 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18260 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
18270 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
18280 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
18290 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
182a0 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
182b0 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
182c0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
182d0 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
182e0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
182f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
18300 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
18310 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
18320 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
18330 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
18340 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
18350 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
18360 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
18370 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
18380 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
18390 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
183a0 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
183b0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
183c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
183d0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
183e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
183f0 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
18400 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
18410 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
18420 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
18430 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
18440 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
18450 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
18460 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
18470 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
18480 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
18490 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
184a0 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  Run, pTab->costM
184b0 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ult);.      wher
184c0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
184d0 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
184e0 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
184f0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
18500 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
18510 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
18520 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
18530 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
18540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18550 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
18560 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
18570 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
18580 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
18590 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
185a0 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
185b0 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
185c0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
185d0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
185e0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
185f0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
18600 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
18610 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
18620 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
18630 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
18640 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
18650 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
18660 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
18670 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
18680 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
18690 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
186a0 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
186b0 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
186c0 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
186d0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
186e0 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
186f0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
18700 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
18710 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
18720 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
18730 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
18740 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
18750 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18760 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
18770 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
18780 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
18790 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
187a0 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
187b0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
187c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
187d0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
187e0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
187f0 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
18800 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  The cost of visi
18810 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72  ting the index r
18820 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72  ows is N*K, wher
18830 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e K is.        *
18840 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  * between 1.1 an
18850 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67  d 3.0, depending
18860 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
18870 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20   sizes of the.  
18880 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61        ** index a
18890 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49  nd table rows. I
188a0 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
188b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
188c0 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  can,.        ** 
188d0 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73  also add the cos
188e0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61  t of visiting ta
188f0 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29  ble rows (N*3.0)
18900 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
18910 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
18920 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
18930 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
18940 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
18950 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
18960 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
18970 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
18980 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
18990 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a  Run, rSize+16);.
189a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
189b0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
189c0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
189d0 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
189e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
189f0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
18a00 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
18a10 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
18a20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
18a30 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
18a40 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
18a50 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
18a60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
18a70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18a80 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68    }..    rc = wh
18a90 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
18aa0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
18ab0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
18ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18ad0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
18ae0 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
18af0 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
18b00 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
18b10 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
18b20 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
18b30 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
18b40 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
18b50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
18b60 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
18b70 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
18b80 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
18b90 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
18ba0 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
18bb0 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18bc0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
18bd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
18be0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18bf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f  _VIRTUALTABLE../
18c00 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
18c10 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64  dxInfo is alread
18c20 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  y populated with
18c30 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
18c40 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20   that may.** be 
18c50 75 73 65 64 20 62 79 20 74 68 65 20 76 69 72 74  used by the virt
18c60 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69  ual table identi
18c70 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
18c80 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68  ->pNew->iTab. Th
18c90 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  is.** function m
18ca0 61 72 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66  arks a subset of
18cb0 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e   those constrain
18cc0 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b  ts usable, invok
18cd0 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49  es the.** xBestI
18ce0 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20  ndex method and 
18cf0 61 64 64 73 20 74 68 65 20 72 65 74 75 72 6e 65  adds the returne
18d00 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64  d plan to pBuild
18d10 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73  er..**.** A cons
18d20 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64  traint is marked
18d30 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a   usable if:.**.*
18d40 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d  *   * Argument m
18d50 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73  Usable indicates
18d60 20 74 68 61 74 20 69 74 73 20 70 72 65 72 65 71   that its prereq
18d70 75 69 73 69 74 65 73 20 61 72 65 20 61 76 61 69  uisites are avai
18d80 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  lable, and.**.**
18d90 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f     * It is not o
18da0 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
18db0 6f 72 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ors specified in
18dc0 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61   the mExclude ma
18dd0 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20  sk passed.**    
18de0 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20 61   as the fourth a
18df0 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69  rgument (which i
18e00 6e 20 70 72 61 63 74 69 63 65 20 69 73 20 65 69  n practice is ei
18e10 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29  ther WO_IN or 0)
18e20 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
18e30 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
18e40 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
18e50 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
18e60 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  d before the.** 
18e70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
18e80 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65   question. These
18e90 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
18ea0 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69  e plans prerequi
18eb0 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  sites.** before 
18ec0 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 70  it is added to p
18ed0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f  Builder..**.** O
18ee0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
18ef0 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20  *pbIn is set to 
18f00 74 72 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e  true if the plan
18f10 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64   added to pBuild
18f20 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f  er.** uses one o
18f30 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72  r more WO_IN ter
18f40 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ms, or false oth
18f50 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
18f60 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
18f70 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
18f80 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18f90 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69   *pBuilder,.  Bi
18fa0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fc0 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   Mask of tables 
18fd0 74 68 61 74 20 6d 75 73 74 20 62 65 20 75 73 65  that must be use
18fe0 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  d. */.  Bitmask 
18ff0 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  mUsable,        
19000 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
19010 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73  of usable tables
19020 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75   */.  u16 mExclu
19030 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
19040 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65        /* Exclude
19050 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65   terms using the
19060 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  se operators */.
19070 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
19080 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
19090 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f    /* Populated o
190a0 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73 74 49  bject for xBestI
190b0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
190c0 62 49 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  bIn             
190d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
190e0 3a 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75  : True if plan u
190f0 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f  ses an IN(...) o
19100 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43  p */.){.  WhereC
19110 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
19120 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74  ilder->pWC;.  st
19130 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
19140 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
19150 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
19160 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
19170 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
19180 20 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78 49   *pUsage = pIdxI
19190 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
191a0 55 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Usage;.  int i;.
191b0 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20    int mxTerm;.  
191c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
191d0 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  OK;.  WhereLoop 
191e0 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72  *pNew = pBuilder
191f0 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20  ->pNew;.  Parse 
19200 2a 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64  *pParse = pBuild
19210 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  er->pWInfo->pPar
19220 73 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  se;.  struct Src
19230 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
19240 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49  = &pBuilder->pWI
19250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
19260 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
19270 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
19280 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  = pIdxInfo->nCon
19290 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65  straint;..  asse
192a0 72 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d  rt( (mUsable & m
192b0 50 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71  Prereq)==mPrereq
192c0 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b   );.  *pbIn = 0;
192d0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
192e0 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a  = mPrereq;..  /*
192f0 20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65 20   Set the usable 
19300 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73  flag on the subs
19310 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  et of constraint
19320 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
19330 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  .  ** arguments 
19340 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63  mUsable and mExc
19350 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43  lude. */.  pIdxC
19360 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
19370 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19380 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
19390 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
193a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
193b0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
193c0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
193d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
193e0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64  rm = &pWC->a[pId
193f0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
19400 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  et];.    pIdxCon
19410 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
19420 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
19430 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 73  rereqRight & mUs
19440 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72  able)==pTerm->pr
19450 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20  ereqRight .     
19460 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
19470 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29  ator & mExclude)
19480 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
19490 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
194a0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
194b0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
194c0 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65  e the output fie
194d0 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  lds of the sqlit
194e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
194f0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d  ructure */.  mem
19500 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
19510 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
19520 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  *nConstraint);. 
19530 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66   assert( pIdxInf
19540 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19550 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78  Str==0 );.  pIdx
19560 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
19570 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
19580 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78  xNum = 0;.  pIdx
19590 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
195a0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64  sumed = 0;.  pId
195b0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
195c0 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
195d0 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29  G_DBL / (double)
195e0 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  2;.  pIdxInfo->e
195f0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
19600 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  5;.  pIdxInfo->i
19610 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  dxFlags = 0;.  p
19620 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64  IdxInfo->colUsed
19630 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
19640 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b  4)pSrc->colUsed;
19650 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
19660 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
19670 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74  xBestIndex() met
19680 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74  hod */.  rc = vt
19690 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
196a0 73 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20  se, pSrc->pTab, 
196b0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28  pIdxInfo);.  if(
196c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
196d0 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b  ..  mxTerm = -1;
196e0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
196f0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
19700 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d  aint );.  for(i=
19710 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
19720 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
19730 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e  erm[i] = 0;.  pN
19740 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
19750 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43  ask = 0;.  pIdxC
19760 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
19770 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
19780 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
19790 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
197a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
197b0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
197c0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
197d0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
197e0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
197f0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
19800 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
19810 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
19820 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  erm;.      int j
19830 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
19840 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
19850 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19860 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c  traint.       ||
19870 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a   j<0.       || j
19880 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
19890 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
198a0 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
198b0 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73       || pIdxCons
198c0 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20  ->usable==0.    
198d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20    ){.        rc 
198e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
198f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19900 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
19910 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61  %s.xBestIndex ma
19920 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d  lfunction",pSrc-
19930 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
19940 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19960 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
19970 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
19980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19990 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
199a0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
199b0 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
199c0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
199d0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65  >a[j];.      pNe
199e0 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
199f0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
19a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
19a10 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
19a20 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
19a30 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
19a40 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   pTerm;.      if
19a50 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
19a60 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
19a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19a80 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
19a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
19aa0 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
19ab0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
19ac0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
19ad0 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
19ae0 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
19af0 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  erm;.      if( (
19b00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19b10 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
19b20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
19b30 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
19b40 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
19b50 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
19b60 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  ay not.        *
19b70 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
19b80 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
19b90 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
19ba0 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
19bb0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
19bc0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
19bd0 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
19be0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
19bf0 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ms and.        *
19c00 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
19c10 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
19c20 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
19c30 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
19c40 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
19c50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  .  */.        pI
19c60 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
19c70 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
19c80 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69       pIdxInfo->i
19c90 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  dxFlags &= ~SQLI
19ca0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
19cb0 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70  IQUE;.        *p
19cc0 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28  bIn = 1; assert(
19cd0 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f   (mExclude & WO_
19ce0 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  IN)==0 );.      
19cf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
19d00 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
19d10 54 65 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74  Term+1;.  assert
19d20 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
19d30 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
19d40 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
19d50 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
19d60 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77  ->idxNum;.  pNew
19d70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19d80 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
19d90 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
19da0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
19db0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
19dc0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
19dd0 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
19de0 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e  fo->idxStr;.  pN
19df0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
19e00 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78  ered = (i8)(pIdx
19e10 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
19e20 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49  sumed ?.      pI
19e30 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
19e40 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72   : 0);.  pNew->r
19e50 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
19e60 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19e70 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
19e80 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
19e90 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e  matedCost);.  pN
19ea0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
19eb0 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
19ec0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
19ed0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
19ee0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c   WHERE_ONEROW fl
19ef0 61 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49  ag if the xBestI
19f00 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e  ndex() method in
19f10 64 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61  dicated.  ** tha
19f20 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
19f30 76 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e  visit at most on
19f40 65 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20  e row. Clear it 
19f50 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20  otherwise. */.  
19f60 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  if( pIdxInfo->id
19f70 78 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  xFlags & SQLITE_
19f80 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55  INDEX_SCAN_UNIQU
19f90 45 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  E ){.    pNew->w
19fa0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
19fb0 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b  ONEROW;.  }else{
19fc0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
19fd0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45  gs &= ~WHERE_ONE
19fe0 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROW;.  }.  rc = 
19ff0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1a000 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1a010 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76  .  if( pNew->u.v
1a020 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
1a030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a040 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
1a050 78 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d  xStr);.    pNew-
1a060 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1a070 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52   = 0;.  }.  WHER
1a080 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
1a090 22 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71  "  bIn=%d prereq
1a0a0 49 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71  In=%04llx prereq
1a0b0 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20  Out=%04llx\n",. 
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c       *pbIn, (sql
1a0e0 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65  ite3_uint64)mPre
1a0f0 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
1a100 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1a110 74 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77  te3_uint64)(pNew
1a120 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1a130 72 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  req)));..  retur
1a140 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1a150 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1a160 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
1a170 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1a180 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
1a190 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
1a1a0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
1a1b0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
1a1c0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
1a1d0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
1a1e0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1a1f0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1a200 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20  IN joins in the 
1a210 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65  query, both mPre
1a220 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  req and.** mUnus
1a230 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
1a240 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50  0. Otherwise, mP
1a250 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1a260 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1a270 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1a280 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1a290 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a2a0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1a2b0 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1a2c0 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1a2d0 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1a2e0 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1a2f0 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1a300 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1a310 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1a320 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1a330 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1a340 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1a350 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1a360 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1a370 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1a380 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1a390 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1a3a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1a3b0 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1a3c0 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1a3d0 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1a3e0 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1a3f0 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1a400 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1a410 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73  n mPrereq corres
1a420 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32  ponds to (t1, t2
1a430 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20  ) and mUnusable 
1a440 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a  to (t5, t6)..**.
1a450 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65  ** All the table
1a460 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73  s in mPrereq mus
1a470 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1a480 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1a490 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
1a4a0 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
1a4b0 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
1a4c0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1a4d0 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
1a4e0 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20   mPrereq may be 
1a4f0 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
1a500 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
1a510 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1a520 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
1a530 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
1a540 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
1a550 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1a560 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
1a570 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
1a580 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1a590 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
1a5a0 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
1a5b0 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
1a5c0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1a5d0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
1a5e0 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
1a5f0 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
1a600 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1a610 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
1a620 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1a630 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
1a640 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
1a650 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1a660 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a680 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1a690 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1a6a0 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
1a6b0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1a6c0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
1a6d0 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
1a6e0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1a6f0 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
1a700 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a710 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1a720 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1a730 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1a740 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
1a750 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
1a760 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
1a770 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a790 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1a7a0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1a7b0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
1a7c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1a7d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1a7e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a7f0 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
1a800 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1a810 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1a820 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1a830 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  x_info *p;      
1a840 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61   /* Object to pa
1a850 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ss to xBestIndex
1a860 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  () */.  int nCon
1a870 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1a880 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a890 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  f constraints in
1a8a0 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b   p */.  int bIn;
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a8d0 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e  plan uses IN(...
1a8e0 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
1a8f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1a900 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74  .  Bitmask mBest
1a910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a920 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62  /* Tables used b
1a930 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  y best possible 
1a940 70 6c 61 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  plan */..  asser
1a950 74 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55  t( (mPrereq & mU
1a960 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20  nusable)==0 );. 
1a970 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
1a980 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
1a990 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1a9a0 50 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70  Parse;.  pWC = p
1a9b0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1a9c0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1a9d0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
1a9e0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1a9f0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
1aa00 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69  ;.  assert( IsVi
1aa10 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
1aa20 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63  ) );.  p = alloc
1aa30 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
1aa40 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61  rse, pWC, mUnusa
1aa50 62 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  ble, pSrc, pBuil
1aa60 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
1aa70 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1aa80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1aa90 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1aaa0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1aab0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1aac0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1aad0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1aae0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1aaf0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1ab00 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1ab10 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1ab20 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1ab30 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1ab40 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1ab50 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1ab60 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1ab70 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1ab80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ab90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1aba0 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78   /* First call x
1abb0 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1abc0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1abd0 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48   usable. */.  WH
1abe0 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1abf0 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1ac00 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a  ll usable\n"));.
1ac10 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1ac20 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42  AddVirtualOne(pB
1ac30 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1ac40 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20   ALLBITS, 0, p, 
1ac50 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  &bIn);..  /* If 
1ac60 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73  the call to xBes
1ac70 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1ac80 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20  l terms enabled 
1ac90 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a  produced a plan.
1aca0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1acb0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 73  ot require any s
1acc0 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f  ource tables (IO
1acd0 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d  W: a plan with m
1ace0 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74  Best==0),.  ** t
1acf0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
1ad00 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20  point in making 
1ad10 61 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c  any further call
1ad20 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1ad30 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  ) .  ** since th
1ad40 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75  ey will all retu
1ad50 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  rn the same resu
1ad60 6c 74 20 28 69 66 20 74 68 65 20 78 42 65 73 74  lt (if the xBest
1ad70 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70  Index().  ** imp
1ad80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73  lementation is s
1ad90 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ane). */.  if( r
1ada0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1adb0 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e  (mBest = (pNew->
1adc0 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1add0 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  q))!=0 ){.    in
1ade0 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20  t seenZero = 0; 
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ae00 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69  rue if a plan wi
1ae10 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65  th no prereqs se
1ae20 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65  en */.    int se
1ae30 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20  enZeroNoIN = 0; 
1ae40 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20          /* Plan 
1ae50 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1ae60 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73  and no IN(...) s
1ae70 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  een */.    Bitma
1ae80 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20  sk mPrev = 0;.  
1ae90 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e    Bitmask mBestN
1aea0 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oIn = 0;..    /*
1aeb0 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f   If the plan pro
1aec0 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61 72  duced by the ear
1aed0 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61  lier call uses a
1aee0 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20  n IN(...) term, 
1aef0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73  call.    ** xBes
1af00 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68  tIndex again, th
1af10 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28  is time with IN(
1af20 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62  ...) terms disab
1af30 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  led. */.    if( 
1af40 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45  bIn ){.      WHE
1af50 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1af60 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1af70 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c  l usable w/o IN\
1af80 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n"));.      rc =
1af90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1afa0 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1afb0 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1afc0 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 26 62  TS, WO_IN, p, &b
1afd0 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  In);.      asser
1afe0 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  t( bIn==0 );.   
1aff0 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70     mBestNoIn = p
1b000 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1b010 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66  Prereq;.      if
1b020 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29  ( mBestNoIn==0 )
1b030 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  {.        seenZe
1b040 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
1b050 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1b060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b070 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65  .    /* Call xBe
1b080 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72  stIndex once for
1b090 20 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76   each distinct v
1b0a0 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52  alue of (prereqR
1b0b0 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29  ight & ~mPrereq)
1b0c0 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
1b0d0 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61  set of terms tha
1b0e0 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63  t apply to the c
1b0f0 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74  urrent virtual t
1b100 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68  able.  */.    wh
1b110 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1b120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1b130 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  i;.      Bitmask
1b140 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53   mNext = ALLBITS
1b150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b160 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20  mNext>0 );.     
1b170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1b180 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
1b190 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
1b1a0 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20  This = (.       
1b1b0 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61       pWC->a[p->a
1b1c0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
1b1d0 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65  ermOffset].prere
1b1e0 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1b1f0 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  q.        );.   
1b200 20 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d       if( mThis>m
1b210 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e  Prev && mThis<mN
1b220 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54  ext ) mNext = mT
1b230 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  his;.      }.   
1b240 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74     mPrev = mNext
1b250 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1b260 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65  t==ALLBITS ) bre
1b270 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  ak;.      if( mN
1b280 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e  ext==mBest || mN
1b290 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29  ext==mBestNoIn )
1b2a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b2b0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1b2c0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1b2d0 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d  : mPrev=%04llx m
1b2e0 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a  Next=%04llx\n",.
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1b310 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73  uint64)mPrev, (s
1b320 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e  qlite3_uint64)mN
1b330 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  ext));.      rc 
1b340 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1b350 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65  rtualOne(pBuilde
1b360 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78  r, mPrereq, mNex
1b370 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  t|mPrereq, 0, p,
1b380 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1b390 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d  ( pNew->prereq==
1b3a0 6d 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  mPrereq ){.     
1b3b0 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1b3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e  .        if( bIn
1b3d0 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f  ==0 ) seenZeroNo
1b3e0 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1b3f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b400 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1b410 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68  estIndex() in th
1b420 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64  e above loop did
1b430 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e   not find a plan
1b440 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71  .    ** that req
1b450 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20  uires no source 
1b460 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69  tables at all (i
1b470 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65  .e. one guarante
1b480 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
1b490 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20  usable), make a 
1b4a0 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61  call here with a
1b4b0 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  ll source tables
1b4c0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20   disabled */.   
1b4d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b4e0 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d  OK && seenZero==
1b4f0 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  0 ){.      WHERE
1b500 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1b510 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1b520 64 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20  disabled\n"));. 
1b530 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b540 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1b550 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1b560 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20  eq, mPrereq, 0, 
1b570 70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  p, &bIn);.      
1b580 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65  if( bIn==0 ) see
1b590 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20  nZeroNoIN = 1;. 
1b5a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b5b0 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1b5c0 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20 73  stIndex() have s
1b5d0 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20  o far failed to 
1b5e0 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20  find a plan.    
1b5f0 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ** that requires
1b600 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65   no source table
1b610 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65  s at all and doe
1b620 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28  s not use an IN(
1b630 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72  ...).    ** oper
1b640 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e  ator, make a fin
1b650 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69  al call to obtai
1b660 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a  n one here.  */.
1b670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b680 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72  TE_OK && seenZer
1b690 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20  oNoIN==0 ){.    
1b6a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1b6b0 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1b6c0 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20  e: all disabled 
1b6d0 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b  and w/o IN\n"));
1b6e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1b6f0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1b700 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ne(pBuilder, mPr
1b710 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57  ereq, mPrereq, W
1b720 4f 5f 49 4e 2c 20 70 2c 20 26 62 49 6e 29 3b 0a  O_IN, p, &bIn);.
1b730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b740 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
1b750 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
1b760 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a  ree(p->idxStr);.
1b770 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b780 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1b790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1b7a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b7b0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1b7c0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
1b7d0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
1b7e0 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
1b7f0 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
1b800 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
1b810 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
1b820 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
1b830 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1b840 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c  pAddOr(.  WhereL
1b850 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1b860 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b  lder, .  Bitmask
1b870 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74   mPrereq, .  Bit
1b880 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29  mask mUnusable.)
1b890 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
1b8a0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1b8b0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
1b8c0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
1b8d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1b8e0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1b8f0 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
1b900 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b910 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
1b920 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
1b930 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
1b940 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
1b950 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
1b960 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73   sSum, sCur;.  s
1b970 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b980 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
1b990 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1b9a0 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  pWC;.  pWCEnd = 
1b9b0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
1b9c0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
1b9d0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1b9e0 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
1b9f0 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
1ba00 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
1ba10 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
1ba20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
1ba30 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
1ba40 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
1ba50 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
1ba60 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
1ba70 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
1ba80 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
1ba90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1baa0 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
1bab0 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
1bac0 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
1bad0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
1bae0 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
1baf0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
1bb00 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
1bb10 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1bb20 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
1bb30 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
1bb40 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
1bb50 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
1bb60 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1bb70 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
1bb80 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1bb90 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
1bba0 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
1bbb0 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
1bbc0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1bbd0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1bbe0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1bbf0 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
1bc00 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1bc10 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70  0x200, ("Begin p
1bc20 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1bc30 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1bc40 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  ));.      for(pO
1bc50 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
1bc60 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
1bc70 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
1bc80 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
1bc90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1bca0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
1bcb0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1bcc0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
1bcd0 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
1bce0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1bcf0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1bd00 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
1bd10 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1bd20 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
1bd30 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
1bd40 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
1bd50 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
1bd60 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
1bd70 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
1bd80 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
1bd90 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1bda0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
1bdb0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1bdc0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
1bdd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bde0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1bdf0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1be00 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
1be10 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  0;.#ifdef WHERET
1be20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
1be30 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1be40 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d  0x200, ("OR-term
1be50 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64   %d of %p has %d
1be60 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a   subterms:\n", .
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d     (int)(pOrTerm
1be90 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72  -pOrWC->a), pTer
1bea0 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43  m, sSubBuild.pWC
1beb0 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  ->nTerm));.     
1bec0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
1bed0 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30  ereTrace & 0x400
1bee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
1bef0 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69  r(i=0; i<sSubBui
1bf00 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  ld.pWC->nTerm; i
1bf10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1bf20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
1bf30 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  &sSubBuild.pWC->
1bf40 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20  a[i], i);.      
1bf50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1bf60 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1bf70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1bf80 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1bf90 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
1bfa0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1bfb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1bfc0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1bfd0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1bfe0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1bff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
1c000 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
1c010 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c020 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1c030 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  e(&sSubBuild, mP
1c040 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20  rereq);.        
1c050 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1c060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c070 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1c080 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53  ereLoopAddOr(&sS
1c090 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1c0a0 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1c0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c0c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1c0d0 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
1c0e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1c0f0 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
1c100 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1c110 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
1c120 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c130 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
1c140 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1c150 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
1c160 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
1c170 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1c180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c190 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72    WhereOrSet sPr
1c1a0 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ev;.          wh
1c1b0 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
1c1c0 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
1c1d0 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1c1e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1c1f0 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
1c200 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1c210 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
1c220 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1c230 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
1c240 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
1c250 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
1c260 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
1c270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1c290 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1c2a0 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
1c2b0 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
1c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1c2e0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1c2f0 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
1c300 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
1c310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1c320 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c330 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c340 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1c350 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
1c360 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
1c370 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
1c380 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1c390 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
1c3a0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1c3b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
1c3c0 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1c3d0 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
1c3e0 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
1c3f0 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
1c400 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1c410 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
1c420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1c430 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65  /* TUNING: Curre
1c440 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  ntly sSum.a[i].r
1c450 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  Run is set to th
1c460 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
1c470 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ts.        ** of
1c480 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72   all sub-scans r
1c490 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
1c4a0 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c  R-scan. However,
1c4b0 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67   due to rounding
1c4c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
1c4d0 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68  rs, it may be th
1c4e0 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  at the cost of t
1c4f0 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71  he OR-scan is eq
1c500 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20  ual to its.     
1c510 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e     ** most expen
1c520 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41  sive sub-scan. A
1c530 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  dd the smallest 
1c540 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79  possible penalty
1c550 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71   .        ** (eq
1c560 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74  uivalent to mult
1c570 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74  iplying the cost
1c580 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73   by 1.07) to ens
1c590 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20  ure that .      
1c5a0 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e    ** this does n
1c5b0 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72  ot happen. Other
1c5c0 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20  wise, for WHERE 
1c5d0 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20  clauses such as 
1c5e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
1c5f0 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74  ollowing where t
1c600 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1c610 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20   on "y":.       
1c620 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
1c630 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
1c640 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f  ood(x=?, 0.99) O
1c650 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a  R y=?.        **
1c660 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1c670 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63  planner may elec
1c680 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68  t to "OR" togeth
1c690 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  er a full-table 
1c6a0 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20  scan and an.    
1c6b0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f      ** index loo
1c6c0 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73  kup. And other s
1c6d0 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73  imilarly odd res
1c6e0 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ults.  */.      
1c6f0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
1c700 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
1c710 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
1c720 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
1c730 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
1c740 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
1c750 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
1c760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1c770 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1c780 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1c790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
1c7a0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1c7b0 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20  "End processing 
1c7c0 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1c7d0 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a   pTerm));.    }.
1c7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
1c800 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
1c810 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
1c820 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
1c830 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
1c840 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
1c850 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
1c860 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1c870 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1c880 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
1c890 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20   mPrereq = 0;.  
1c8a0 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
1c8b0 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
1c8c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1c8d0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
1c8e0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1c8f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c900 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53  Item;.  struct S
1c910 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e  rcList_item *pEn
1c920 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  d = &pTabList->a
1c930 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d  [pWInfo->nLevel]
1c940 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1c950 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1c960 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
1c970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
1c980 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1c990 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70   u8 priorJointyp
1c9a0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  e = 0;..  /* Loo
1c9b0 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65  p over the table
1c9c0 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66  s in the join, f
1c9d0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1c9e0 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42  t */.  pNew = pB
1c9f0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1ca00 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e  whereLoopInit(pN
1ca10 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d  ew);.  for(iTab=
1ca20 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73  0, pItem=pTabLis
1ca30 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64  t->a; pItem<pEnd
1ca40 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b  ; iTab++, pItem+
1ca50 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
1ca60 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  mUnusable = 0;. 
1ca70 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
1ca80 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
1ca90 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
1caa0 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
1cab0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
1cac0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
1cad0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
1cae0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c  em->fg.jointype|
1caf0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26  priorJointype) &
1cb00 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1cb10 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
1cb20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69   /* This conditi
1cb30 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  on is true when 
1cb40 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f  pItem is the FRO
1cb50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e  M clause term on
1cb60 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69   the.      ** ri
1cb70 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  ght-hand-side of
1cb80 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53   a LEFT or CROSS
1cb90 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20   JOIN.  */.     
1cba0 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f   mPrereq = mPrio
1cbb0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
1cbc0 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74  orJointype = pIt
1cbd0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
1cbe0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
1cbf0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1cc00 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1cc10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b  SrcList_item *p;
1cc20 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49  .      for(p=&pI
1cc30 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20  tem[1]; p<pEnd; 
1cc40 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
1cc50 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28  ( mUnusable || (
1cc60 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  p->fg.jointype &
1cc70 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1cc80 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  SS)) ){.        
1cc90 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73    mUnusable |= s
1cca0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1ccb0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1ccc0 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72  kSet, p->iCursor
1ccd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1cce0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1ccf0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1cd00 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ual(pBuilder, mP
1cd10 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1cd20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cd30 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1cd40 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1cd50 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
1cd60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1cd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cd80 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1cd90 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
1cda0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1cdb0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1cdc0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1cdd0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1cde0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1cdf0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1ce00 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1ce10 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1ce20 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1ce30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1ce40 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1ce50 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1ce60 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1ce70 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1ce80 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1ce90 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1cea0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1ceb0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1cec0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1ced0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1cee0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1cef0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1cf00 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1cf10 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1cf20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1cf30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1cf40 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1cf50 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1cf60 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1cf70 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1cf80 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1cf90 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1cfa0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1cfb0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1cfc0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1cfd0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1cfe0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1cff0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1d000 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1d010 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1d020 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1d030 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1d040 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1d050 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1d060 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1d070 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1d080 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1d090 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1d0a0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1d0b0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1d0c0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1d0d0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1d0e0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1d0f0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1d100 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1d110 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1d120 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1d130 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1d140 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1d150 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1d160 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1d170 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1d180 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1d190 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1d1a0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1d1b0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1d1c0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1d1d0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1d1e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1d1f0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1d200 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1d210 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d220 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d230 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1d240 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1d250 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1d260 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1d270 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1d280 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1d290 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1d2a0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1d2b0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1d2c0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1d2d0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1d2e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1d2f0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1d300 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1d310 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1d320 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1d330 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1d340 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1d350 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1d360 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1d370 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1d380 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1d390 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1d3a0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1d3b0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1d3c0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1d3d0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1d3e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1d3f0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1d400 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1d410 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1d420 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1d430 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1d440 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1d450 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1d460 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1d470 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1d480 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1d490 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1d4a0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1d4b0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1d4c0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1d4d0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1d4e0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1d4f0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1d500 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1d510 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1d520 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1d530 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1d540 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1d550 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1d560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1d570 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1d580 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1d590 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1d5a0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1d5b0 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1d5c0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1d5d0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1d5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d5f0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1d600 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1d610 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1d620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d630 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1d640 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1d650 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1d660 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1d670 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d680 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1d690 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1d6a0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1d6b0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1d6c0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1d6d0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1d6e0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1d6f0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1d700 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1d710 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1d720 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1d730 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1d740 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1d750 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1d760 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1d770 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1d780 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1d790 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1d7a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1d7b0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1d7c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1d7d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1d7e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1d7f0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1d800 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1d810 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1d820 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1d830 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1d840 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1d850 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1d860 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1d870 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1d880 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1d890 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1d8a0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1d8b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1d8c0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1d8d0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1d8e0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1d8f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1d900 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1d910 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1d920 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1d930 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1d940 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1d950 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1d960 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1d970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1d980 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1d990 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1d9a0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1d9b0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1d9c0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1d9d0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1d9e0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1d9f0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1da00 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1da10 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1da20 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1da30 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1da40 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1da50 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1da60 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1da70 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1da80 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1da90 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1daa0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1dab0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1dac0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1dad0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1dae0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1daf0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1db00 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1db10 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1db20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1db30 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1db40 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1db50 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1db60 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1db70 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1db80 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1db90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1dba0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1dbb0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1dbc0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1dbd0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1dbe0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1dbf0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1dc00 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1dc10 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1dc20 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1dc30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1dc40 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1dc50 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1dc60 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1dc70 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1dc80 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1dc90 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1dca0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1dcb0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1dcc0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1dcd0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1dce0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1dcf0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1dd00 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1dd10 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1dd20 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1dd30 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1dd40 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1dd50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1dd60 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1dd70 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1dd80 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1dd90 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1dda0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1ddb0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1ddc0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1ddd0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1dde0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ddf0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1de00 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1de10 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1de20 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1de30 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1de40 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1de50 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1de60 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1de70 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1de80 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1de90 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1dea0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1deb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1dec0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1ded0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1dee0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1def0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1df00 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1df10 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1df20 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1df30 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1df40 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1df50 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1df60 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1df70 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1df80 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1df90 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1dfa0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1dfb0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1dfc0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1dfd0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1dfe0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1dff0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1e000 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1e010 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1e020 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1e030 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1e040 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e050 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1e060 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1e070 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1e080 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1e090 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1e0a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e0b0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1e0c0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1e0d0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1e0e0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1e0f0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1e100 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1e110 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1e120 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1e130 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1e140 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1e150 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1e160 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1e170 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1e180 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1e190 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1e1a0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1e1b0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1e1c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1e1d0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1e1e0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1e1f0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1e200 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1e210 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1e220 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1e230 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1e240 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1e250 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1e260 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1e270 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1e280 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e290 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e2a0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1e2b0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1e2c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1e2d0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1e2e0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1e300 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1e310 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1e320 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1e330 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1e340 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1e350 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1e360 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1e370 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1e380 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1e390 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1e3a0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1e3b0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1e3c0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1e3d0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1e3e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1e3f0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1e400 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1e410 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1e420 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1e430 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1e440 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1e450 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1e460 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1e470 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1e480 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1e490 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1e4a0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1e4b0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1e4c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e4d0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1e4e0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e4f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e500 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1e510 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1e520 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1e530 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1e540 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1e550 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e560 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1e570 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1e580 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e590 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1e5a0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1e5b0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1e5c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1e5d0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1e5e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1e5f0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1e600 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1e610 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1e620 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1e630 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1e650 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1e660 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1e670 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1e680 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1e690 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1e6a0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1e6b0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1e6c0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1e6d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e6e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1e6f0 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1e700 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1e730 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
1e740 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1e750 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1e760 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1e770 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e780 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1e790 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1e7a0 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1e7b0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1e7c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1e7d0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1e7e0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1e7f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1e800 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1e810 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1e820 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1e830 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1e840 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1e850 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1e860 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1e870 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1e880 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1e890 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1e8a0 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1e8b0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1e8c0 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1e8d0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1e8e0 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1e8f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1e900 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1e910 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1e920 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1e930 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1e940 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1e950 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1e960 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1e970 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e980 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1e990 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1e9a0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1e9b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1e9d0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1e9e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1e9f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1ea00 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1ea10 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1ea20 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1ea30 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1ea40 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1ea50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1ea60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ea70 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1ea80 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1ea90 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1eaa0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1eab0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1eac0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1ead0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1eae0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1eaf0 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1eb00 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1eb10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1eb20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1eb30 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1eb40 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1eb50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1eb60 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1eb70 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1eb80 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1eb90 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1eba0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1ebb0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1ebc0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1ebd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ebe0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1ebf0 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1ec00 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1ec10 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1ec20 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1ec30 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1ec40 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1ec50 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1ec60 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1ec70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1ec80 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1ec90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1eca0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1ecb0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1ecc0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1ecd0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1ece0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1ecf0 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1ed00 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1ed10 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1ed20 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1ed30 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1ed40 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1ed50 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1ed60 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1ed70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1ed80 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1ed90 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1eda0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1edb0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1edc0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1edd0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1ede0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1edf0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1ee00 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1ee10 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1ee20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1ee30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1ee40 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1ee50 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1ee60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1ee70 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1ee80 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1ee90 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1eea0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1eeb0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1eec0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1eed0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1eee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1eef0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1ef00 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1ef10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ef20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1ef30 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1ef40 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1ef50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1ef60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1ef70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1ef80 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1ef90 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1efa0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1efb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1efc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1efd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1efe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1eff0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1f000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1f010 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f020 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1f030 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1f040 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1f050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f060 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1f070 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1f080 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f090 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f0a0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1f0b0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1f0c0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1f0d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0e0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1f0f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1f100 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1f110 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1f120 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1f130 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1f140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f150 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1f160 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1f170 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1f180 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f190 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1f1a0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1f1b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1f1c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1f1d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1f1e0 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1f1f0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1f200 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1f210 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1f220 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1f230 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1f240 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f250 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1f260 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1f270 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1f280 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1f290 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1f2a0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1f2b0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1f2c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1f2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f2e0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1f2f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1f300 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1f310 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f320 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1f330 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1f340 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1f350 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1f360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1f370 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1f380 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1f390 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1f3a0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1f3b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1f3c0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1f3d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1f3e0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1f3f0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1f400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1f410 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1f420 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f430 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f450 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1f460 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1f470 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1f480 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1f490 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1f4a0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1f4b0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1f4c0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1f4d0 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1f4e0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1f4f0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1f500 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1f510 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1f520 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1f530 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1f540 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1f550 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1f560 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1f570 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1f580 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1f590 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1f5a0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1f5b0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1f5c0 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1f5d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1f5e0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1f5f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f600 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1f610 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1f620 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1f630 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1f640 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1f650 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1f660 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1f670 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1f680 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1f690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f6a0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1f6b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1f6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1f6d0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1f6e0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1f6f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f700 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1f710 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1f720 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1f730 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1f740 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1f750 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1f760 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1f770 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1f780 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1f790 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1f7a0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1f7b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1f7c0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1f7d0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1f7e0 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1f7f0 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1f800 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f810 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1f820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1f830 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1f840 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1f850 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1f860 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1f870 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1f880 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1f890 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1f8a0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1f8b0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1f8c0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1f8d0 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1f8e0 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1f8f0 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1f900 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1f910 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1f920 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1f930 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1f940 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1f950 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1f960 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1f970 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1f980 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1f990 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1f9a0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1f9b0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1f9c0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1f9d0 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1f9e0 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1f9f0 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1fa00 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1fa10 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1fa20 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1fa30 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1fa40 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1fa50 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1fa60 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1fa70 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1fa80 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1fa90 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1faa0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1fab0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1fac0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1fad0 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1fae0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1faf0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1fb00 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1fb10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1fb20 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1fb30 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1fb40 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1fb50 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1fb60 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1fb70 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1fb80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1fb90 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1fba0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1fbb0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1fbc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1fbd0 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1fbe0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1fbf0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1fc00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1fc10 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1fc20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1fc30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1fc40 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1fc50 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1fc60 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1fc70 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1fc80 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1fc90 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1fca0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1fcb0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1fcc0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1fcd0 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1fce0 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1fcf0 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1fd00 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1fd10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1fd20 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1fd30 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1fd40 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1fd50 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1fd60 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1fd70 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1fd80 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1fd90 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1fda0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1fdb0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1fdc0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1fdd0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1fde0 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1fdf0 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1fe00 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1fe10 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1fe20 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1fe30 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1fe40 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1fe50 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1fe60 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1fe70 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1fe80 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1fe90 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1fea0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1feb0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1fec0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1fed0 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1fee0 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1fef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1ff00 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1ff10 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1ff20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1ff30 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1ff40 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1ff50 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1ff60 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1ff70 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1ff80 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1ff90 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1ffa0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1ffb0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1ffc0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1ffd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1ffe0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1fff0 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
20000 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
20010 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
20020 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
20030 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
20040 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
20050 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
20060 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
20070 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
20080 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
20090 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
200a0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
200b0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
200c0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
200d0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
200e0 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
200f0 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20  nRow + rScale + 
20100 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70  16;..  /* Multip
20110 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65  le by log(M) whe
20120 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
20130 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
20140 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
20150 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69  LIMIT for M if i
20160 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  t is smaller */.
20170 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
20180 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
20190 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20  E_USE_LIMIT)!=0 
201a0 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69  && pWInfo->iLimi
201b0 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52  t<nRow ){.    nR
201c0 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  ow = pWInfo->iLi
201d0 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74  mit;.  }.  rSort
201e0 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e  Cost += estLog(n
201f0 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Row);.  return r
20200 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a  SortCost;.}../*.
20210 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
20220 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
20230 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
20240 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
20250 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
20260 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
20270 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
20280 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
20290 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
202a0 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
202b0 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
202c0 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
202d0 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
202e0 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
202f0 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
20300 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
20310 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
20320 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
20330 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
20340 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
20350 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
20360 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
20370 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
20380 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
20390 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
203a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
203b0 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
203c0 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
203d0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
203e0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
203f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
20400 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
20410 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
20420 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
20430 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
20440 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
20450 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
20460 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
20470 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
20480 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
20490 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
204a0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
204b0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
204c0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
204d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
204e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
204f0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
20500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20520 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
20530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20540 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20550 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
20560 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
20570 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
20580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20590 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
205a0 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
205b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
205c0 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
205d0 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
205e0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
205f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20600 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
20610 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
20620 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
20630 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
20640 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
20650 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
20660 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e  */.  LogEst mxUn
20670 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f  sorted = 0;    /
20680 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74  * Maximum unsort
20690 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  ed cost of a set
206a0 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e   of path */.  in
206b0 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
206c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
206d0 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
206e0 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
206f0 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
20700 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
20710 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
20720 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
20730 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
20740 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
20750 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
20760 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
20770 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
20780 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
20790 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
207a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
207b0 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
207c0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
207d0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
207e0 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
207f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
20800 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
20810 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
20820 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
20830 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
20840 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
20850 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
20860 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
20870 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
20880 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
20890 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
208a0 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f  e memory */.  Lo
208b0 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20  gEst *aSortCost 
208c0 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69  = 0;    /* Sorti
208d0 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73  ng and partial s
208e0 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a  orting costs */.
208f0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
20900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20910 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
20920 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
20930 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tine */.  int nS
20940 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
20950 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
20960 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
20970 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20  at pSpace */..  
20980 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
20990 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
209a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
209b0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
209c0 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
209d0 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
209e0 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
209f0 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
20a00 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
20a10 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
20a20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
20a30 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
20a40 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
20a50 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
20a60 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
20a70 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
20a80 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31  oice = (nLoop<=1
20a90 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
20aa0 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
20ab0 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
20ac0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
20ad0 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
20ae0 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
20af0 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e  -- begin solver.
20b00 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e    (nRowEst=%d)\n
20b10 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20  ", nRowEst));.. 
20b20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69   /* If nRowEst i
20b30 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  s zero and there
20b40 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
20b50 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69  clause, ignore i
20b60 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20  t. In this.  ** 
20b70 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65  case the purpose
20b80 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
20b90 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
20ba0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
20bb0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79  returned.  ** by
20bc0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65   the overall que
20bd0 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73  ry. Once this es
20be0 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20  timate has been 
20bf0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61  obtained, the ca
20c00 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69  ller.  ** will i
20c10 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
20c20 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ion a second tim
20c30 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65  e, passing the e
20c40 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20  stimate as the. 
20c50 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61   ** nRowEst para
20c60 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  meter.  */.  if(
20c70 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
20c80 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
20c90 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72  =0 ){.    nOrder
20ca0 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  By = 0;.  }else{
20cb0 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
20cc0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
20cd0 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
20ce0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
20cf0 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
20d00 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20   for aTo, aFrom 
20d10 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  and aSortCost[] 
20d20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73  */.  nSpace = (s
20d30 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
20d40 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
20d50 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
20d60 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20  ice*2;.  nSpace 
20d70 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
20d80 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ) * nOrderBy;.  
20d90 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
20da0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
20db0 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
20dc0 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74   pSpace==0 ) ret
20dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20de0 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28  _BKPT;.  aTo = (
20df0 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
20e00 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
20e10 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
20e20 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
20e30 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
20e40 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
20e50 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
20e60 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
20e70 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
20e80 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
20e90 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
20ea0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
20eb0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
20ec0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
20ed0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
20ee0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
20ef0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
20f00 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
20f10 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
20f20 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
20f30 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
20f40 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
20f50 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
20f60 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
20f70 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
20f80 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
20f90 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
20fa0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
20fb0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
20fc0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
20fd0 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
20fe0 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
20ff0 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
21000 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
21010 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
21020 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
21030 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
21040 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
21050 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
21060 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
21070 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
21080 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
21090 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
210a0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
210b0 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
210c0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
210d0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
210e0 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
210f0 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
21100 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
21110 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
21120 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
21130 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
21140 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
21150 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
21160 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
21170 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
21180 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
21190 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
211a0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
211b0 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74   above 28.  If t
211c0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
211d0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
211e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
211f0 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
21200 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
21210 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  8.  ** rows, the
21220 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
21230 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
21240 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
21250 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
21260 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
21270 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d  8);  assert( 48=
21280 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
21290 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  8) );.  nFrom = 
212a0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
212b0 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
212c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
212d0 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
212e0 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
212f0 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
21300 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
21310 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
21320 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
21330 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
21340 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
21350 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
21360 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
21370 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
21380 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
21390 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
213a0 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
213b0 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
213c0 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
213d0 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
213e0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
213f0 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
21400 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
21410 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
21420 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
21430 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
21440 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
21450 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
21460 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
21470 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
21480 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
21490 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
214a0 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
214b0 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
214c0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
214d0 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
214e0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
214f0 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
21500 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
21510 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
21520 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
21530 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
21540 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
21550 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
21560 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
21570 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
21580 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
21590 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
215a0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
215b0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
215c0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
215d0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
215e0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
215f0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
21600 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
21610 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
21620 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
21630 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
21640 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
21650 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
21660 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
21670 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
21680 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
21690 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
216a0 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
216b0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
216c0 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
216d0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
216e0 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
216f0 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
21700 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
21710 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
21720 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
21730 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
21740 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
21750 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
21760 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
21790 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
217a0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
217b0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217d0 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
217e0 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
217f0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
21800 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
21810 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
21820 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
21830 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
21840 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
21850 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
21860 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
21870 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
21880 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  (pWLoop->wsFlags
21890 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
218a0 44 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d  DEX)!=0 && pFrom
218b0 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20  ->nRow<10 ){.   
218c0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
218d0 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69   use an automati
218e0 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 74  c index if the t
218f0 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65  his loop is expe
21900 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  cted.          *
21910 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68  * to run less th
21920 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20  an 2 times. */. 
21930 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21940 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
21950 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20  st(2) );.       
21960 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
21980 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
21990 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
219a0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
219b0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
219c0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
219d0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
219e0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
219f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
21a00 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
21a10 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
21a20 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
21a30 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
21a40 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
21a50 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
21a60 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
21a70 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
21a80 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
21a90 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
21aa0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
21ab0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
21ac0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
21ad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
21ae0 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
21af0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
21b00 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
21b10 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
21b20 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
21b30 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
21b40 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
21b50 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
21b60 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21b80 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
21b90 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
21ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21bb0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
21bc0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
21bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21be0 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
21bf0 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
21c00 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
21c10 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
21c20 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
21c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
21c40 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
21c50 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
21c60 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
21c70 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
21c80 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
21c90 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
21ca0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21cc0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
21cd0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
21ce0 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
21cf0 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
21d00 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
21d10 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
21d20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
21d30 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
21d40 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
21d50 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
21d60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21d70 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
21d80 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
21d90 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
21da0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
21db0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
21dc0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
21dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21de0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
21df0 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
21e00 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
21e10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
21e20 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
21e30 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
21e40 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
21e50 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
21e60 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
21e70 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21e80 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
21e90 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
21ea0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
21eb0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
21ec0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
21ed0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
21ee0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
21ef0 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
21f00 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
21f10 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
21f20 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
21f30 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
21f40 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
21f50 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
21f60 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
21f70 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
21f80 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
21f90 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
21fa0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
21fb0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
21fc0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
21fd0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
21fe0 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21ff0 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
22000 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22010 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
22020 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
22030 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
22040 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
22050 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
22060 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
22070 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
22080 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
22090 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
220a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
220b0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
220c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
220d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
220e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
220f0 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
22100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
22110 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
22120 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
22130 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
22140 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
22150 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
22160 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
22170 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
22180 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
22190 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
221a0 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
221b0 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
221c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
221d0 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
221e0 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
221f0 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
22200 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
22210 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
22220 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
22230 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
22240 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
22250 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
22260 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
22270 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
22280 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
22290 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
222a0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
222b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
222c0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
222e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
222f0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
22300 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
22310 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
22320 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
22330 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
22340 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
22350 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
22360 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
22370 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
22380 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
22390 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
223a0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
223b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
223c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
223d0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
223e0 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
223f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
22400 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
22410 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
22420 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
22430 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
22440 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
22450 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
22460 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
22470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
22480 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
22490 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
224a0 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
224b0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
224c0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
224d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
224e0 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
224f0 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
22500 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
22510 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
22520 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
22530 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
22540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22550 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
22560 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
22570 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
22580 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
22590 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
225a0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
225b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
225c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
225d0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
225e0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
225f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22600 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
22610 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
22620 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
22630 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
22640 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
22650 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
22660 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
22670 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22690 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
226a0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
226b0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
226c0 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
226d0 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
226e0 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
226f0 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
22700 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
22710 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
22720 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
22730 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
22740 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
22750 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
22760 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
22770 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
22780 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
22790 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
227a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
227b0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
227c0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
227d0 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
227e0 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
227f0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
22800 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
22810 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
22820 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
22830 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22850 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22870 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
22880 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
22890 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
228a0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
228b0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
228c0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
228d0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
228f0 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
22900 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
22910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22920 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22930 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
22940 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
22950 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
22960 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
22970 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
22980 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
22990 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
229c0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
229d0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
229e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
229f0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
22a00 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
22a10 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
22a20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
22a30 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
22a40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22a50 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
22a60 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
22a70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
22a80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22a90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22aa0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
22ab0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
22ac0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
22ad0 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
22ae0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
22af0 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
22b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
22b10 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
22b20 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
22b30 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
22b40 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
22b50 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
22b60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
22b70 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
22b80 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
22b90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22ba0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
22bb0 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
22bc0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
22bd0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
22be0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
22bf0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
22c00 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
22c10 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
22c30 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
22c40 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
22c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22c60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22c70 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
22c80 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
22c90 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
22ca0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
22cb0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
22cc0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
22cd0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
22cf0 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
22d00 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
22d10 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
22d20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
22d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d40 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
22d50 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
22d60 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
22d70 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
22d80 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
22d90 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
22da0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
22db0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
22dc0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
22dd0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
22de0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
22df0 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
22e00 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
22e10 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
22e20 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
22e30 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
22e40 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
22e50 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
22e60 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
22e70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
22e80 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
22e90 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
22ea0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
22eb0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
22ec0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
22ed0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
22ee0 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
22ef0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
22f00 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
22f10 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
22f20 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
22f30 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
22f40 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
22f50 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
22f60 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
22f70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22f80 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
22f90 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
22fa0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
22fb0 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
22fc0 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
22fd0 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
22fe0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22ff0 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
23000 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
23010 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
23020 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
23030 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
23040 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
23050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
23080 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
23090 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
230a0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
230b0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
230c0 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
230d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
230e0 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
230f0 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
23100 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
23110 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
23120 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
23130 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
23140 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23150 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
23160 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
23170 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
23180 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
23190 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
231a0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
231b0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
231c0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
231d0 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
231e0 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
231f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
23200 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
23210 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23220 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23230 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
23240 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
23250 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
23270 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23280 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23290 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
232a0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
232b0 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
232c0 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
232d0 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
232e0 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
232f0 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
23300 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
23310 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
23320 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
23330 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
23340 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
23350 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23360 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
23370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23380 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
23390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
233a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
233b0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
233c0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
233d0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
233e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
233f0 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
23400 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
23410 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
23420 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
23430 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
23440 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
23450 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
23460 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
23470 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
23480 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
23490 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
234a0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
234b0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
234c0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
234d0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
234e0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
234f0 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
23500 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
23510 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
23520 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
23530 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
23540 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
23550 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
23560 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
23570 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
23580 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
23590 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
235a0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
235b0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
235c0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
235d0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
235e0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
235f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23600 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
23610 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
23620 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
23630 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
23640 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
23650 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
23660 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
23670 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
23680 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
23690 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
236a0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
236c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
236d0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
236e0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
236f0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
23700 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
23710 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
23720 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
23730 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
23740 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
23750 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
23760 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
23770 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
23780 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
23790 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
237a0 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
237b0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
237c0 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
237d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
237e0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
237f0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
23800 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
23810 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
23820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23830 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
23840 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
23850 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
23860 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
23870 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
23880 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
23890 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
238a0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
238b0 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
238c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
238d0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
238e0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
238f0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
23900 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
23910 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
23920 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
23930 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
23940 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
23950 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
23960 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
23970 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
23980 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
23990 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
239a0 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
239b0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
239c0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
239d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
239e0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
239f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
23a00 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
23a10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
23a20 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
23a30 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
23a40 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
23a50 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
23a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23a70 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
23a80 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
23a90 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
23aa0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
23ab0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
23ac0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
23ad0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
23ae0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
23af0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23b00 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
23b10 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
23b20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
23b30 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
23b40 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
23b50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
23b60 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
23b70 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
23b80 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
23b90 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
23ba0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
23bb0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
23bc0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
23bd0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
23be0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
23bf0 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
23c00 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
23c10 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
23c20 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
23c30 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
23c40 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
23c50 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
23c60 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
23c70 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
23c80 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
23c90 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
23ca0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
23cb0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
23cc0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
23cd0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
23ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23cf0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
23d00 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
23d10 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
23d20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
23d30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23d40 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
23d50 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
23d60 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
23d70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
23d80 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
23d90 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
23da0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
23db0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20  Index *pIdx;..  
23dc0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
23dd0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
23de0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23df0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
23e00 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
23e10 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
23e20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23e30 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
23e40 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
23e50 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
23e60 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
23e70 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
23e80 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
23e90 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
23ea0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
23eb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
23ec0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
23ed0 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
23ee0 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
23ef0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
23f00 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
23f10 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
23f20 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
23f30 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
23f40 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
23f50 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
23f60 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
23f70 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
23f80 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23f90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23fa0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
23fb0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
23fc0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
23fd0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
23fe0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
23ff0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
24000 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
24010 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
24020 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
24030 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
24040 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
24050 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
24060 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
24070 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
24080 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
24090 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
240a0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
240b0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
240c0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
240d0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
240e0 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
240f0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
24100 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
24110 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
24120 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
24130 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
24140 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
24150 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
24160 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
24170 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
24180 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
24190 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
241a0 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
241b0 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
241c0 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
241d0 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
241e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
241f0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
24200 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
24210 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
24220 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
24230 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
24240 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
24250 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
24260 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
24270 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
24280 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24290 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
242a0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
242b0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
242c0 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
242d0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
242e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
242f0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
24300 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
24310 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
24320 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
24330 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
24340 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
24350 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
24360 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
24370 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
24380 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
24390 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
243a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
243b0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
243c0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
243d0 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
243e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
243f0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
24400 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
24410 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
24420 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
24430 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
24440 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
24450 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
24460 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
24470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24480 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
24490 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
244a0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
244b0 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
244c0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
244d0 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
244e0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
244f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
24500 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
24510 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
24520 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
24530 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
24540 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
24550 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
24560 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
24570 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
24580 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e  BSat =  pWInfo->
24590 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
245a0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
245b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
245c0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
245d0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
245e0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
245f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
24600 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
24610 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24620 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
24630 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
24640 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
24650 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24660 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
24670 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24680 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
24690 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
246a0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
246b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
246c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
246d0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
246e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
246f0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
24700 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
24710 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
24720 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
24730 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
24740 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
24750 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
24760 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
24770 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
24780 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
24790 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
247a0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
247b0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
247c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
247d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
247e0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
247f0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
24800 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
24810 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
24820 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
24830 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
24840 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
24850 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
24860 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
24870 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
24880 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
24890 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
248a0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
248b0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
248c0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
248d0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
248e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
248f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
24900 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
24910 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
24920 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
24930 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
24940 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
24950 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
24960 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
24970 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
24980 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
24990 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
249a0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
249b0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
249c0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
249d0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
249e0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
249f0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
24a00 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
24a10 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
24a20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
24a30 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
24a40 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
24a70 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
24a80 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
24ab0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
24ac0 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
24ad0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
24ae0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
24af0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
24b00 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
24b10 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
24b20 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
24b30 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
24b40 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
24b50 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
24b60 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
24b70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
24b80 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
24b90 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
24ba0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
24bb0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
24bc0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
24bd0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
24be0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
24bf0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
24c00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
24c10 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
24c20 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
24c30 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
24c40 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
24c50 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
24c60 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
24c70 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
24c80 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
24c90 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
24ca0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
24cb0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
24cc0 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
24cd0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
24ce0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
24cf0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
24d00 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
24d10 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
24d20 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
24d30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
24d40 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
24d50 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
24d60 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
24d70 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
24d80 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
24d90 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
24da0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
24db0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
24dc0 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
24dd0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
24de0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
24df0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
24e00 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
24e10 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
24e20 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
24e30 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
24e40 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
24e50 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
24e60 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
24e70 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
24e80 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
24e90 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
24ea0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
24eb0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
24ec0 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
24ed0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
24ee0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
24ef0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
24f00 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
24f10 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
24f20 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
24f30 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
24f40 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
24f50 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
24f60 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
24f70 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
24f80 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
24f90 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
24fa0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
24fb0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
24fc0 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
24fd0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
24fe0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
24ff0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
25000 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
25010 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
25020 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
25030 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
25040 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
25050 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
25060 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
25070 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
25080 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
25090 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
250a0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
250b0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
250c0 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
250d0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
250e0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
250f0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
25100 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
25110 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
25120 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
25130 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
25140 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
25150 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
25160 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
25170 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
25180 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
25190 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
251a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
251b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
251c0 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
251d0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
251e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
251f0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
25200 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
25210 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
25220 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
25230 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
25240 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
25250 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
25260 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
25270 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
25280 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
25290 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
252a0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
252b0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
252c0 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
252d0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
252e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
252f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
25300 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
25310 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
25320 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
25330 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
25340 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
25350 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
25360 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
25370 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
25380 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
25390 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
253a0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
253b0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
253c0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
253d0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
253e0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
253f0 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
25400 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
25410 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
25420 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
25430 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  .** WHERE_ONETAB
25440 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
25450 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
25460 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
25470 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
25480 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
25490 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
254a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
254b0 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
254c0 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
254d0 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
254e0 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
254f0 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
25500 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
25510 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
25520 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
25530 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
25540 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
25550 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
25560 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
25570 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
25580 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
25590 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
255a0 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
255b0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
255c0 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
255d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
255e0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
255f0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
25600 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
25610 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
25620 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
25630 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
25640 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
25650 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
25660 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
25670 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
25680 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
25690 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
256a0 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
256b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
256c0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
256d0 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
256e0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
256f0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
25700 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
25710 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
25720 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
25730 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
25740 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20  int iAuxArg     
25750 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
25760 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
25770 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
25780 72 73 6f 72 20 6e 75 6d 62 65 72 2c 0a 20 20 20  rsor number,.   
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45       ** If WHERE
257b0 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e  _USE_LIMIT, then
257c0 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e   the limit amoun
257d0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  t */.){.  int nB
257e0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
257f0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
25800 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
25810 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
25820 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
25830 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
25840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
25850 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
25860 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
25870 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
25880 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
25890 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
258a0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
258b0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
258c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
258d0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
258e0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
258f0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
25900 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
25910 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
25920 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
25930 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
25940 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
25950 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
25960 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
25970 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
25980 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
25990 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
259a0 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
259b0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
259c0 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
259d0 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
259e0 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
259f0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
25a00 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
25a10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
25a20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
25a30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
25a40 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
25a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25a60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
25a70 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
25a80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
25a90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
25aa0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ac0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25ad0 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65  .  u8 bFordelete
25ae0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
25af0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
25b00 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70  E or zero, as ap
25b10 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20  propriate */..  
25b20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
25b30 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
25b40 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
25b50 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
25b60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25b70 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
25b80 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
25b90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
25ba0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
25bb0 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
25bc0 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20   /* Only one of 
25bd0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
25be0 4e 4c 59 20 6f 72 20 57 48 45 52 45 5f 55 53 45  NLY or WHERE_USE
25bf0 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65  _LIMIT */.  asse
25c00 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
25c10 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
25c20 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
25c30 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
25c40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
25c50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20  _LIMIT)==0 );.. 
25c60 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
25c70 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
25c80 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
25c90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
25ca0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
25cb0 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
25cc0 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
25cd0 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
25ce0 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
25cf0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
25d00 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
25d10 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
25d20 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
25d30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
25d40 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
25d50 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
25d60 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
25d70 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
25d80 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
25d90 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
25da0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
25db0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
25dc0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
25dd0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
25de0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
25df0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
25e00 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
25e10 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
25e20 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
25e30 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
25e40 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
25e50 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
25e60 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
25e70 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
25e80 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
25e90 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
25ea0 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
25eb0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
25ec0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
25ed0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
25ee0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
25ef0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
25f00 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
25f10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25f20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25f30 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
25f40 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
25f50 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
25f60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
25f70 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
25f80 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
25f90 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
25fa0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
25fb0 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
25fc0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
25fd0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
25fe0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
25ff0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
26000 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
26010 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
26020 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
26030 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
26040 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
26050 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
26060 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
26070 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
26080 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
26090 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
260a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
260b0 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
260c0 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
260d0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
260e0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
260f0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
26100 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
26110 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
26120 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
26130 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
26140 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
26150 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
26160 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
26170 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
26180 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
26190 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
261a0 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
261b0 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
261c0 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
261d0 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
261e0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
261f0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
26200 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
26210 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
26220 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
26230 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
26240 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
26250 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
26260 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
26270 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
26280 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
26290 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
262a0 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
262b0 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
262c0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
262d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
262e0 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f  yteWInfo + sizeo
262f0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
26300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26310 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
26320 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26330 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
26340 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
26350 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
26360 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
26370 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
26380 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
26390 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
263a0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
263b0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
263c0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
263d0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
263e0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
263f0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
26400 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
26410 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
26420 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
26430 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
26440 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
26450 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
26460 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
26470 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
26480 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
26490 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
264a0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69  Info->iLimit = i
264b0 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f  AuxArg;.  pWInfo
264c0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
264d0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
264e0 72 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74  ryLoop;.  assert
264f0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
26500 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
26510 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64  );  /* ONEPASS d
26520 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a  efaults to OFF *
26530 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  /.  pMaskSet = &
26540 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
26550 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
26560 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
26570 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
26580 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
26590 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
265a0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
265b0 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
265c0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
265d0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
265e0 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
265f0 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
26600 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
26610 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
26620 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
26630 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
26640 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
26650 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
26660 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
26670 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
26680 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
26690 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
266a0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
266b0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
266c0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
266d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
266e0 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
266f0 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
26700 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
26710 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
26720 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
26730 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
26740 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
26750 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
26760 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
26770 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
26780 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
26790 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
267a0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
267b0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
267c0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
267d0 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
267e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
267f0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
26800 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
26810 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
26820 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
26830 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
26840 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26850 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
26860 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
26870 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
268a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
268b0 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
268c0 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
268d0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
268e0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
268f0 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
26900 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
26910 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
26920 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
26930 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
26940 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
26950 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
26960 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26970 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
26980 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
26990 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
269a0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
269b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
269c0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
269d0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
269e0 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
269f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26a00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
26a10 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
26a20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
26a30 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
26a40 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a  sk of 1<<N..  **
26a50 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f  .  ** The rule o
26a60 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
26a70 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
26a80 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
26a90 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a   bitmask for.  *
26aa0 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65  * a table T, the
26ab0 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69 74  n X-1 is the bit
26ac0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68  mask for all oth
26ad0 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  er tables to the
26ae0 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a   left of T..  **
26af0 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
26b00 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
26b10 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
26b20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
26b30 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74  s.  ** important
26b40 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
26b50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
26b60 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
26b70 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
26b80 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
26b90 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
26ba0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
26bb0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
26bc0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
26bd0 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
26be0 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
26bf0 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
26c00 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
26c10 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
26c20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
26c30 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
26c40 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
26c50 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
26c60 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
26c70 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
26c80 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
26c90 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
26ca0 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
26cb0 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
26cc0 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
26cd0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
26ce0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
26cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26d00 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b  EBUG.  for(ii=0;
26d10 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
26d20 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42  rc; ii++){.    B
26d30 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
26d40 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
26d50 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
26d60 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
26d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
26d80 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b  ==MASKBIT(ii) );
26d90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
26da0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
26db0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
26dc0 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
26dd0 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
26de0 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
26df0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
26e00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26e10 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
26e20 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ginError;..  if(
26e30 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
26e40 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
26e50 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
26e60 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
26e70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
26e80 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
26e90 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
26ea0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
26eb0 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
26ec0 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
26ed0 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
26ee0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
26ef0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
26f00 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
26f10 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
26f20 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
26f30 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
26f40 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
26f50 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
26f60 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
26f70 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
26f80 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
26f90 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
26fa0 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
26fb0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52  o->pOrderBy = pR
26fc0 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a  esultSet;.    }.
26fd0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
26fe0 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
26ff0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  p objects */.#if
27000 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
27010 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
27020 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
27030 72 61 63 65 20 26 20 30 78 66 66 66 66 20 29 7b  race & 0xffff ){
27040 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27050 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74  gPrintf("*** Opt
27060 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
27070 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78   (wctrlFlags: 0x
27080 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b  %x",wctrlFlags);
27090 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
270a0 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
270b0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73  LIMIT ){.      s
270c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
270d0 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c  f(", limit: %d",
270e0 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d   iAuxArg);.    }
270f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27100 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a  gPrintf(")\n");.
27110 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
27120 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
27130 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
27140 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
27150 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27160 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
27170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c    for(i=0; i<sWL
27180 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  B.pWC->nTerm; i+
27190 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
271a0 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70  ermPrint(&sWLB.p
271b0 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
271c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
271d0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
271e0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
271f0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
27200 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
27210 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
27220 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
27230 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
27240 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
27250 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
27260 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
27270 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
27280 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
27290 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
272a0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
272b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
272c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
272d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
272e0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
272f0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
27300 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
27310 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
27350 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
27360 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
27370 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
27380 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
27390 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
273a0 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
273b0 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
273c0 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
273d0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
273e0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
273f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
27400 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
27410 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
27420 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
27430 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
27440 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
27450 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
27460 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
27470 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
27480 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
27490 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
274a0 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
274b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
274c0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
274d0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
274e0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
274f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
27500 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
27510 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
27520 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
27530 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c  fo->revMask = AL
27540 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28  LBITS;.  }.  if(
27550 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
27560 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
27570 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
27580 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
27590 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
275a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
275b0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
275c0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
275d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
275e0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
275f0 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
27600 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
27610 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
27620 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
27630 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27640 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
27650 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  %d,0x%llx", pWIn
27660 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e  fo->nOBSat, pWIn
27670 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
27680 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
27690 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
276a0 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
276b0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
276c0 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
276d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
276e0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
276f0 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
27700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27710 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
27720 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
27730 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
27740 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27750 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
27760 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
27770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27780 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
27790 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
277a0 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
277b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
277c0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
277d0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
277e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
277f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27800 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
27810 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
27820 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  0; ii<pWInfo->nL
27830 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  evel; ii++){.   
27840 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
27850 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e  t(pWInfo->a[ii].
27860 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43  pWLoop, sWLB.pWC
27870 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
27880 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  dif.  /* Attempt
27890 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20   to omit tables 
278a0 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68  from the join th
278b0 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74  at do not effect
278c0 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
278d0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
278e0 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65  vel>=2.   && pRe
278f0 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26  sultSet!=0.   &&
27900 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
27910 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
27920 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20  OmitNoopJoin).  
27930 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74  ){.    Bitmask t
27940 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33  abUsed = sqlite3
27950 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
27960 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
27970 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
27980 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
27990 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
279a0 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
279b0 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
279c0 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
279d0 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
279e0 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
279f0 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
27a00 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
27a10 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
27a20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
27a30 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
27a40 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
27a50 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
27a60 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
27a70 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f  oop->iTab].fg.jo
27a80 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
27a90 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
27aa0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
27ab0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
27ac0 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
27ad0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
27ae0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27af0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
27b00 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
27b10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
27b20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
27b30 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
27b40 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
27b50 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
27b60 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
27b70 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
27b80 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
27b90 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
27ba0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
27bb0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
27bc0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
27bd0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
27be0 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
27bf0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
27c00 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
27c10 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
27c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
27c30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
27c40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27c50 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
27c60 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
27c70 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
27c80 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
27c90 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
27ca0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
27cb0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
27cc0 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
27cd0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
27ce0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
27cf0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
27d00 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
27d10 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
27d20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
27d30 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
27d40 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
27d50 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
27d60 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
27d70 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
27d80 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
27d90 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
27da0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
27db0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
27dc0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
27dd0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
27de0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
27df0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
27e00 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
27e10 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
27e20 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
27e30 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27e40 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
27e50 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
27e60 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
27e70 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
27e80 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
27e90 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
27ea0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
27eb0 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
27ec0 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c  .     || ((wctrl
27ed0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
27ee0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21  EPASS_MULTIROW)!
27ef0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
27f00 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57   0==(wsFlags & W
27f10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27f20 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E)).    ){.     
27f30 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
27f40 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e  s = bOnerow ? ON
27f50 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f  EPASS_SINGLE : O
27f60 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20  NEPASS_MULTI;.  
27f70 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
27f80 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
27f90 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67  pTab) && (wsFlag
27fa0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
27fb0 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LY) ){.        i
27fc0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
27fd0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
27fe0 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  LTIROW ){.      
27ff0 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d      bFordelete =
28000 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
28010 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
28020 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
28030 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
28040 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e  s = (wsFlags & ~
28050 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b  WHERE_IDX_ONLY);
28060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28070 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
28080 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
28090 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
280a0 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
280b0 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
280c0 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
280d0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
280e0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
280f0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
28100 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
28110 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
28120 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
28130 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
28140 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
28150 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
28160 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
28170 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
28180 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
28190 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
281a0 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
281b0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
281c0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
281d0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
281e0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
281f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
28200 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
28210 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
28220 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
28230 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
28240 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
28250 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
28260 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
28270 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
28280 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
28290 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
282a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
282b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
282c0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
282d0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
282e0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
282f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28300 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
28310 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
28320 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
28330 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
28340 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
28350 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
28360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28370 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
28380 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
28390 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
283a0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
283b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
283c0 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
283d0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
283e0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
283f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
28400 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
28410 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
28420 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
28430 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
28440 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
28450 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
28460 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
28470 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
28480 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
28490 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
284a0 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
284b0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
284c0 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  0] = pTabItem->i
284d0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b  Cursor;.      };
284e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
284f0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
28500 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
28510 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
28520 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28530 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
28540 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  or==pLevel->iTab
28550 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
28560 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65  tcase( pWInfo->e
28570 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
28580 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
28590 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
285a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
285b0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
285c0 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54  NEPASS_OFF && pT
285d0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b  ab->nCol==BMS );
285e0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
285f0 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
28600 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
28610 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
28620 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
28630 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
28640 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
28650 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
28660 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
28670 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
28680 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
28690 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
286a0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c  ngeP4(v, -1, SQL
286b0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
286c0 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
286d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
286e0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
286f0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
28700 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
28710 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69  OR_HINTS.      i
28720 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  f( pLoop->u.btre
28730 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
28740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28750 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
28760 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72  FLAG_SEEKEQ|bFor
28770 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
28780 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
28790 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69    {.        sqli
287a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
287b0 76 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  v, bFordelete);.
287c0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
287d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
287e0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
287f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28800 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
28810 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61  ColumnsUsed, pTa
28820 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
28830 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54    (const u8*)&pT
28860 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c  abItem->colUsed,
28870 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
28880 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
28890 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
288a0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
288b0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
288c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
288d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
288e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
288f0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
28900 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
28910 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
28920 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
28930 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
28940 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
28950 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
28960 2f 2a 20 69 41 75 78 41 72 67 20 69 73 20 61 6c  /* iAuxArg is al
28970 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
28980 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
28990 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
289a0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
289b0 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21  assert( iAuxArg!
289c0 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
289d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
289e0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
289f0 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
28a00 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
28a10 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
28a20 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
28a30 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
28a40 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
28a50 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20  BLE_ONLY)!=0.   
28a60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
28a70 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
28a80 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
28a90 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
28aa0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
28ab0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
28ac0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
28ad0 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
28ae0 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
28af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
28b00 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
28b10 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
28b20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
28b30 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
28b40 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41  >eOnePass!=ONEPA
28b50 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
28b60 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54    Index *pJ = pT
28b70 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49  abItem->pTab->pI
28b80 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49  ndex;.        iI
28b90 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72  ndexCur = iAuxAr
28ba0 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  g;.        asser
28bb0 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  t( wctrlFlags & 
28bc0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
28bd0 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  SIRED );.       
28be0 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
28bf0 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b  J) && pJ!=pIx ){
28c00 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65  .          iInde
28c10 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  xCur++;.        
28c20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74    pJ = pJ->pNext
28c30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28c40 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
28c50 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
28c60 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
28c70 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43  ass[1] = iIndexC
28c80 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ur;.      }else 
28c90 69 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28  if( iAuxArg && (
28ca0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28cb0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
28cc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28cd0 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
28ce0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
28cf0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
28d00 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29  ERE_REOPEN_IDX )
28d10 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49   op = OP_ReopenI
28d20 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dx;.      }else{
28d30 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
28d40 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
28d50 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
28d60 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
28d70 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
28d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
28d90 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
28da0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
28db0 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
28dc0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
28dd0 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20   if( op ){.     
28de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28df0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
28e00 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
28e10 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
28e20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
28e30 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
28e40 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pIx);.        if
28e50 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
28e60 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
28e70 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20  AINT)!=0.       
28e80 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
28e90 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
28ea0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
28eb0 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20  _SKIPSCAN))==0. 
28ec0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
28ed0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
28ee0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
28ef0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )==0.        ){.
28f00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28f10 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
28f20 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b   OPFLAG_SEEKEQ);
28f30 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44   /* Hint to COMD
28f40 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  B2 */.        }.
28f50 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
28f60 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
28f70 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64  x->zName));.#ifd
28f80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28f90 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
28fa0 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  K.        {.    
28fb0 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65        u64 colUse
28fc0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
28fd0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20   int ii, jj;.   
28fe0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
28ff0 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   ii<pIx->nColumn
29000 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
29010 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61       jj = pIx->a
29020 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20  iColumn[ii];.   
29030 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c           if( jj<
29040 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
29050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
29060 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20  >63 ) jj = 63;. 
29070 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
29080 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
29090 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29  d & MASKBIT(jj))
290a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
290b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
290c0 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c  sed |= ((u64)1)<
290d0 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36  <(ii<63 ? ii : 6
290e0 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
290f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29100 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
29110 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
29120 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c  d, iIndexCur, 0,
29130 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65      (u8*)&colUse
29160 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  d, P4_INT64);.  
29170 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
29180 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
29190 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
291a0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
291b0 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  }.    if( iDb>=0
291c0 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
291d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
291e0 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
291f0 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
29200 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
29210 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
29220 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29230 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
29240 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
29250 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
29260 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
29270 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
29280 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
29290 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
292a0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
292b0 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
292c0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
292d0 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
292e0 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
292f0 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
29300 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
29310 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
29320 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b  int addrExplain;
29330 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
29340 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
29350 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20  pWInfo->a[ii];. 
29360 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65     wsFlags = pLe
29370 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
29380 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51  lags;.#ifndef SQ
29390 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
293a0 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
293b0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
293c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
293d0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
293e0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
293f0 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
29400 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
29410 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
29420 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
29430 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
29440 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
29450 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
29460 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29470 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
29480 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
29490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64  }.#endif.    add
294a0 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74  rExplain = sqlit
294b0 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e  e3WhereExplainOn
294c0 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70  eScan(.        p
294d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
294e0 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65   pLevel, ii, pLe
294f0 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72  vel->iFrom, wctr
29500 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20  lFlags.    );.  
29510 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f    pLevel->addrBo
29520 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
29530 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
29540 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73      notReady = s
29550 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f  qlite3WhereCodeO
29560 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
29570 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79  fo, ii, notReady
29580 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
29590 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
295a0 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20  l->addrCont;.   
295b0 20 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48   if( (wsFlags&WH
295c0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30  ERE_MULTI_OR)==0
295d0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26   && (wctrlFlags&
295e0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
295f0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
29600 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64   sqlite3WhereAdd
29610 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54  ScanStatus(v, pT
29620 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
29630 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20  addrExplain);.  
29640 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f    }.  }..  /* Do
29650 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ne. */.  VdbeMod
29660 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
29670 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65  Begin WHERE-core
29680 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  "));.  return pW
29690 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
296a0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
296b0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
296c0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20  ginError:.  if( 
296d0 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50  pWInfo ){.    pP
296e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
296f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
29700 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  NQueryLoop;.    
29710 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
29720 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20  , pWInfo);.  }. 
29730 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
29740 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
29750 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
29760 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
29770 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
29780 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
29790 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
297a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
297b0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
297c0 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
297d0 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
297e0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
297f0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
29800 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29810 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29820 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
29830 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  vel;.  WhereLoop
29840 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69   *pLoop;.  SrcLi
29850 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
29860 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
29870 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
29880 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
29890 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
298a0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
298b0 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  e..  */.  VdbeMo
298c0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
298d0 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22  "End WHERE-core"
298e0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ));.  sqlite3Exp
298f0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
29900 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
29910 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
29920 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
29930 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65  nt addr;.    pLe
29940 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
29950 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
29960 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
29970 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29980 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
29990 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
299a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
299b0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
299c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
299d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
299e0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
299f0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
29a00 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
29a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
29a20 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
29a30 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
29a40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
29a50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29a60 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
29a70 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
29a80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
29a90 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
29aa0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
29ab0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
29ac0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
29ad0 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  P_VNext);.    }.
29ae0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
29af0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
29b00 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
29b10 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
29b20 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
29b30 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
29b40 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
29b50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29b60 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
29b70 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
29b80 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
29b90 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
29ba0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
29bb0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
29bc0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
29bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
29be0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
29bf0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
29c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29c10 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45  ddOp2(v, pIn->eE
29c20 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69  ndLoopOp, pIn->i
29c30 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
29c40 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Top);.        Vd
29c50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
29c60 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
29c70 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
29c80 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65  ndLoopOp==OP_Pre
29c90 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  vIfOpen);.      
29ca0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
29cb0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
29cc0 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70  pOp==OP_NextIfOp
29cd0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  en);.        sql
29ce0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29cf0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
29d00 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
29d10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29d20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
29d30 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
29d40 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
29d50 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29  evel->addrSkip )
29d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
29d70 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
29d80 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
29d90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29da0 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73  (v, "next skip-s
29db0 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f  can on %s", pLoo
29dc0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
29dd0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
29de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
29df0 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
29e00 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
29e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
29e20 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
29e30 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20  >addrSkip-2);.  
29e40 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
29e50 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
29e60 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69  ATCH_BLOBS.    i
29e70 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
29e80 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
29e90 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66  int op;.      if
29ea0 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
29eb0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Op(v, pLevel->ad
29ec0 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31  drLikeRep-1)->p1
29ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
29ee0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
29ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29f00 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a         op = OP_J
29f10 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20  umpZeroIncr;.   
29f20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
29f30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29f40 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  op, pLevel->iLik
29f50 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c  eRepCntr, pLevel
29f60 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
29f70 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29f80 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
29f90 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
29fa0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
29fb0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
29fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29fd0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
29fe0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
29ff0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2a000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a010 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2a020 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2a030 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2a040 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
2a050 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2a060 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
2a070 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2a080 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2a090 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
2a0a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a0b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2a0c0 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
2a0d0 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
2a0e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a0f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a100 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2a110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a120 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2a130 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
2a140 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
2a150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2a160 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
2a170 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
2a180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a190 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2a1a0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2a1b0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2a1c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2a1e0 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2a1f0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
2a200 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a210 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a220 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
2a230 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2a240 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
2a250 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
2a260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a270 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
2a280 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2a290 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
2a2a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
2a2b0 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
2a2c0 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
2a2d0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
2a2e0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
2a2f0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
2a300 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2a310 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a320 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2a330 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
2a340 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
2a350 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2a360 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2a370 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
2a380 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2a390 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2a3a0 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
2a3b0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
2a3c0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
2a3d0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
2a3e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a3f0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2a400 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2a410 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
2a420 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
2a430 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
2a440 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
2a450 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2a460 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
2a470 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
2a480 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
2a490 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
2a4a0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
2a4b0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2a4c0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
2a4d0 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75   OP_Copy of resu
2a4e0 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  lt contained in 
2a4f0 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  a register..    
2a500 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f  ** OP_Rowid beco
2a510 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20  mes OP_Null..   
2a520 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2a530 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2a540 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61  utine && !db->ma
2a550 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2a560 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
2a570 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65  umnToCopy(v, pLe
2a580 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  vel->addrBody, p
2a590 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a  Level->iTabCur,.
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2a5c0 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
2a5d0 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
2a5e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2a5f0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
2a600 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
2a610 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
2a620 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2a630 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
2a640 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
2a650 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
2a660 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
2a670 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
2a680 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
2a690 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
2a6a0 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
2a6b0 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
2a6c0 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
2a6d0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
2a6e0 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
2a6f0 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
2a700 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2a710 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2a720 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
2a730 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
2a740 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
2a750 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2a760 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
2a770 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
2a780 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
2a790 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
2a7a0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  s;.      if( pWI
2a7b0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2a7c0 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77  NEPASS_OFF && (w
2a7d0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2a7e0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
2a7f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a800 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
2a810 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2a820 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
2a830 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
2a840 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2a850 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28        && (ws & (
2a860 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
2a870 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20  AUTO_INDEX))==0 
2a880 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65  .       && pLeve
2a890 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e  l->iIdxCur!=pWIn
2a8a0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
2a8b0 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  [1].      ){.   
2a8c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a8d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
2a8e0 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
2a8f0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
2a900 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2a910 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
2a920 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
2a930 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
2a940 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
2a950 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
2a960 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
2a970 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
2a980 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
2a990 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
2a9a0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
2a9b0 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
2a9c0 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
2a9d0 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
2a9e0 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
2a9f0 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
2aa00 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
2aa10 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
2aa20 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2aa30 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2aa40 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2aa50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2aa60 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2aa70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2aa80 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2aa90 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2aaa0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2aab0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2aac0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2aad0 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2aae0 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2aaf0 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2ab00 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2ab10 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2ab20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2ab30 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2ab40 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2ab50 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2ab60 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2ab70 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
2ab80 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
2ab90 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
2aba0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2abb0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
2abc0 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
2abd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2abe0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
2abf0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
2ac00 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
2ac10 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
2ac20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f    && (pWInfo->eO
2ac30 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2ac40 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  OFF || !HasRowid
2ac50 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a  (pIdx->pTable)).
2ac60 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c       && !db->mal
2ac70 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b  locFailed.    ){
2ac80 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
2ac90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2aca0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
2acb0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
2acc0 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
2acd0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2ace0 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
2acf0 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
2ad00 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2ad10 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
2ad20 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2ad30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ad40 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2ad50 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
2ad60 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
2ad70 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2ad80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2ad90 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
2ada0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2adb0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2adc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2add0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
2ade0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2adf0 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2ae00 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
2ae10 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
2ae20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ae30 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
2ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ae50 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
2ae60 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78  nOfIndex(pIdx, x
2ae70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ae80 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x>=0 ){.       
2ae90 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78       pOp->p2 = x
2aea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
2aeb0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2aec0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2aed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
2aee0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2aef0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2af00 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78  DX_ONLY)==0 || x
2af10 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  >=0 );.        }
2af20 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2af30 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2af40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2af50 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2af60 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2af70 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2af80 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2af90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2afa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
2afb0 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
2afc0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  .  pParse->nQuer
2afd0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2afe0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2aff0 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
2b000 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2b010 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.