/ Hex Artifact Content
Login

Artifact 142525786b7855a0997e113f3932833bf5c1f63c:


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 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65 64  WhereScan;.typed
0650: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0660: 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f 73  rCost WhereOrCos
0670: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0680: 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68 65  t WhereOrSet Whe
0690: 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a 20  reOrSet;../*.** 
06a0: 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b 65  Cost X is tracke
06b0: 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29 20  d as 10*log2(X) 
06c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d 62  stored in a 16-b
06d0: 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  it integer.  The
06e0: 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73 74  .** maximum cost
06f0: 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74 61   for ordinary ta
0700: 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a 36  bles is 64*(2**6
0710: 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65 73  3) which becomes
0720: 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74 75   6900..** (Virtu
0730: 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72 65  al tables can re
0740: 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63 6f  turn a larger co
0750: 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61 73  st, but let's as
0760: 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  sume they do not
0770: 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f 73  .).** So all cos
0780: 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ts can be stored
0790: 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e 73   in a 16-bit uns
07a0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77 69  igned integer wi
07b0: 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f 66  thout risk.** of
07c0: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   overflow..**.**
07d0: 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69 6d   Costs are estim
07e0: 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74 20 67  ates, so don't g
07f0: 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61  o to the computa
0800: 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65 20 74  tional trouble t
0810: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31 30 2a  o compute.** 10*
0820: 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c 79 2e  log2(X) exactly.
0830: 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63 6c 6f    Instead, a clo
0840: 73 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 75  se estimate is u
0850: 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75 65 20  sed.  Any value 
0860: 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20 73 74  of.** X<=1 is st
0870: 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d 32 20  ored as 0.  X=2 
0880: 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73 20 31  is 10.  X=3 is 1
0890: 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20 39 39  6.  X=1000 is 99
08a0: 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  . etc..**.** The
08b0: 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73 74 74   tool/wherecostt
08c0: 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  est.c source fil
08d0: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 63  e implements a c
08e0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67  ommand-line prog
08f0: 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c  ram.** that will
0900: 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65 65 6e   convert between
0910: 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20 69 6e   WhereCost to in
0920: 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20 61 64  tegers and do ad
0930: 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 6d 75  dition and.** mu
0940: 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f 6e 20  ltiplication on 
0950: 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65 73  WhereCost values
0960: 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e 64 2d  .  That command-
0970: 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69 73 20  line program is 
0980: 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74 69 6c  a.** useful util
0990: 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f 75  ity to have arou
09a0: 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67 20  nd when working 
09b0: 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75 6c 65  with this module
09c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73  ..*/.typedef uns
09d0: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
09e0: 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a  WhereCost;../*.*
09f0: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f  * This object co
0a00: 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69  ntains informati
0a10: 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  on needed to imp
0a20: 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  lement a single 
0a30: 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69  nested.** loop i
0a40: 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  n WHERE clause..
0a50: 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74  **.** Contrast t
0a60: 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74 68 20  his object with 
0a70: 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73  WhereLoop.  This
0a80: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
0a90: 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  s the.** impleme
0aa0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
0ab0: 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  oop.  WhereLoop 
0ac0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 61 6c  describes the al
0ad0: 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73  gorithm..** This
0ae0: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
0af0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0b00: 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f  e WhereLoop algo
0b10: 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a  rithm as one of.
0b20: 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e  ** its elements.
0b30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72 65  .**.** The Where
0b40: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
0b50: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  ains a single in
0b60: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
0b70: 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63  bject for.** eac
0b80: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
0b90: 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69 63 68  OM clause (which
0ba0: 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f 72 20   is to say, for 
0bb0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  each of the.** n
0bc0: 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73 20 69  ested loops as i
0bd0: 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54 68  mplemented).  Th
0be0: 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65 72 65  e order of Where
0bf0: 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 64 65  Level objects de
0c00: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20  termines.** the 
0c10: 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72 64 65  loop nested orde
0c20: 72 2c 20 77 69 74 68 20 57 68 65 72 65 49 6e 66  r, with WhereInf
0c30: 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74 68 65  o.a[0] being the
0c40: 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a   outer loop and.
0c50: 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57  ** WhereInfo.a[W
0c60: 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d  hereInfo.nLevel-
0c70: 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69 6e 6e  1] being the inn
0c80: 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75  er loop..*/.stru
0c90: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a  ct WhereLevel {.
0ca0: 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b    int iLeftJoin;
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
0cc0: 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20 69  y cell used to i
0cd0: 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55  mplement LEFT OU
0ce0: 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e  TER JOIN */.  in
0cf0: 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
0d00: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
0d10: 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 61  cursor used to a
0d20: 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20  ccess the table 
0d30: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
0d40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
0d50: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73  e VDBE cursor us
0d60: 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 49 64  ed to access pId
0d70: 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  x */.  int addrB
0d80: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rk;          /* 
0d90: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
0da0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
0db0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
0dc0: 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Nxt;          /*
0dd0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 74   Jump here to st
0de0: 61 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e 20  art the next IN 
0df0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  combination */. 
0e00: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
0e10: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
0e20: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
0e30: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c 6f  with the next lo
0e40: 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  op cycle */.  in
0e50: 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20  t addrFirst;    
0e60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 73      /* First ins
0e70: 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e 74 65  truction of inte
0e80: 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f 6f 70  rior of the loop
0e90: 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20   */.  u8 iFrom; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0eb0: 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  hich entry in th
0ec0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
0ed0: 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20 20 20  .  u8 op, p5;   
0ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
0ef0: 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74 68 65  de and P5 of the
0f00: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65 6e 64   opcode that end
0f10: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0f20: 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20 20 20  int p1, p2;     
0f30: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64        /* Operand
0f40: 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  s of the opcode 
0f50: 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74 68 65  used to ends the
0f60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f 6e   loop */.  union
0f70: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
0f80: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0f90: 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  that depends on 
0fa0: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
0fb0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a  */.    struct {.
0fc0: 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20 20        int nIn;  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0fe0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
0ff0: 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a 2f   in aInLoop[] */
1000: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
1010: 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20 20 69  Loop {.        i
1020: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1040: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  E cursor used by
1050: 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
1060: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
1070: 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20 20 20   addrInTop;     
1080: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1090: 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  e IN loop */.   
10a0: 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f 70       u8 eEndLoop
10b0: 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Op;         /* I
10c0: 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  N Loop terminato
10d0: 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50  r. OP_Next or OP
10e0: 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20 20 7d  _Prev */.      }
10f0: 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20   *aInLoop;      
1100: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1110: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e  ion about each n
1120: 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61 74 6f  ested IN operato
1130: 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20 20  r */.    } in;  
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1150: 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57 4c 6f  * Used when pWLo
1160: 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1170: 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20 20  E_IN_ABLE */.   
1180: 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64 78 3b   Index *pCovidx;
1190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
11a0: 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  le covering inde
11b0: 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c 54  x for WHERE_MULT
11c0: 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  I_OR */.  } u;. 
11d0: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
11e0: 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20 54  p *pWLoop;  /* T
11f0: 68 65 20 73 65 6c 65 63 74 65 64 20 57 68 65 72  he selected Wher
1200: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1210: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  };../*.** Each i
1220: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1230: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
1240: 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66  s an algorithm f
1250: 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 6f 6e  or evaluating on
1260: 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61 20 6a  e.** term of a j
1270: 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65 72 6d  oin.  Every term
1280: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1290: 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 61 74  use will have at
12a0: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
12b0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
12c0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28 75 6e  eLoop object (un
12d0: 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42 59 20  less INDEXED BY 
12e0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 70  constraints.** p
12f0: 72 65 76 65 6e 74 20 61 20 71 75 65 72 79 20 73  revent a query s
1300: 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63 68 20  olution - which 
1310: 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61 6e 64  is an error) and
1320: 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 74   many terms of t
1330: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1340: 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74  e will have mult
1350: 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  iple WhereLoop o
1360: 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64 65 73  bjects, each des
1370: 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70 6f 74  cribing a.** pot
1380: 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20 69 6d  ential way of im
1390: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 20  plementing that 
13a0: 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
13b0: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a  , together with.
13c0: 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ** dependencies 
13d0: 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d 61 74  and cost estimat
13e0: 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 65  es for using the
13f0: 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69 74 68   chosen algorith
1400: 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70  m..**.** Query p
1410: 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73 74 73  lanning consists
1420: 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75 70 20   of building up 
1430: 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  a collection of 
1440: 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f 70 0a  these WhereLoop.
1450: 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68 65 6e  ** objects, then
1460: 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70 61 72   computing a par
1470: 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e 63 65  ticular sequence
1480: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
1490: 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a 20 6f  jects, with.** o
14a0: 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ne WhereLoop obj
14b0: 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63 6c 61  ect per FROM cla
14c0: 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74 20 73  use term, that s
14d0: 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70 65 6e  atisfy all depen
14e0: 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64 20 74  dencies.** and t
14f0: 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65  hat minimize the
1500: 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e 0a 2a   overall cost..*
1510: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
1520: 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70  op {.  Bitmask p
1530: 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f 2a 20  rereq;       /* 
1540: 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68 65 72  Bitmask of other
1550: 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75 73 74   loops that must
1560: 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20   run first */.  
1570: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65 6c 66  Bitmask maskSelf
1580: 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  ;     /* Bitmask
1590: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 61 62   identifying tab
15a0: 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66 64 65  le iTab */.#ifde
15b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
15c0: 20 63 68 61 72 20 63 49 64 3b 20 20 20 20 20 20   char cId;      
15d0: 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c         /* Symbol
15e0: 69 63 20 49 44 20 6f 66 20 74 68 69 73 20 6c 6f  ic ID of this lo
15f0: 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  op for debugging
1600: 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20   use */.#endif. 
1610: 20 75 38 20 69 54 61 62 3b 20 20 20 20 20 20 20   u8 iTab;       
1620: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
1630: 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  on in FROM claus
1640: 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72 20 74  e of table for t
1650: 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38  his loop */.  u8
1660: 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20 20 20   iSortIdx;      
1670: 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 69      /* Sorting i
1680: 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20 30 3d  ndex number.  0=
1690: 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65 72 65  =None */.  Where
16a0: 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20 20 20  Cost rSetup;    
16b0: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65 74   /* One-time set
16c0: 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63 72 65  up cost (ex: cre
16d0: 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  ate transient in
16e0: 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72 65 43  dex) */.  WhereC
16f0: 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20 20 20  ost rRun;       
1700: 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e 69  /* Cost of runni
1710: 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f 0a  ng each loop */.
1720: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74    WhereCost nOut
1730: 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d  ;       /* Estim
1740: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
1750: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
1760: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
1770: 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  ct {            
1780: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
1790: 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 62  n for internal b
17a0: 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tree tables */. 
17b0: 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20       int nEq;   
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17d0: 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
17e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
17f0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1800: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  ndex;         /*
1810: 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f 72 20   Index used, or 
1820: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62 74  NULL */.    } bt
1830: 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ree;.    struct 
1840: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1850: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  /* Information f
1860: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1870: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
1880: 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  dxNum;          
1890: 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
18a0: 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e 65  r */.      u8 ne
18b0: 65 64 46 72 65 65 3b 20 20 20 20 20 20 20 20 20  edFree;         
18c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 71 6c    /* True if sql
18d0: 69 74 65 33 5f 66 72 65 65 28 69 64 78 53 74 72  ite3_free(idxStr
18e0: 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ) is needed */. 
18f0: 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
1900: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
1910: 72 75 65 20 69 66 20 73 61 74 69 73 66 69 65 73  rue if satisfies
1920: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
1930: 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b 3b     u16 omitMask;
1940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
1950: 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f  ms that may be o
1960: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  mitted */.      
1970: 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20 20 20  char *idxStr;   
1980: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1990: 69 64 65 6e 74 69 66 69 65 72 20 73 74 72 69 6e  identifier strin
19a0: 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62 3b  g */.    } vtab;
19b0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 77 73  .  } u;.  u32 ws
19c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
19d0: 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  /* WHERE_* flags
19e0: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
19f0: 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  plan */.  u16 nL
1a00: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1a10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1a20: 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b 5d  ries in aLTerm[]
1a30: 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68 65 72   */.  /**** wher
1a40: 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f 70 69  eLoopXfer() copi
1a50: 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76 65 20  es fields above 
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66 69 6e  *******/.# defin
1a80: 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  e WHERE_LOOP_XFE
1a90: 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28 57 68  R_SZ offsetof(Wh
1aa0: 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74 29 0a  ereLoop,nLSlot).
1ab0: 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20 20 20    u16 nLSlot;   
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ad0: 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63  r of slots alloc
1ae0: 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72 6d 5b  ated for aLTerm[
1af0: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1b00: 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f 2a 20   **aLTerm;   /* 
1b10: 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64 20  WhereTerms used 
1b20: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1b30: 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e 65  pNextLoop; /* Ne
1b40: 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  xt WhereLoop obj
1b50: 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72 65  ect in the Where
1b60: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
1b70: 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53 70 61  eTerm *aLTermSpa
1b80: 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69 74 69  ce[4];  /* Initi
1b90: 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70 61 63  al aLTerm[] spac
1ba0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73  e */.};../* This
1bb0: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 74 68   object holds th
1bc0: 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1bd0: 61 6e 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20  and the cost of 
1be0: 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a 20 73 75 62  running a.** sub
1bf0: 71 75 65 72 79 20 6f 6e 20 6f 6e 65 20 6f 70 65  query on one ope
1c00: 72 61 6e 64 20 6f 66 20 61 6e 20 4f 52 20 6f 70  rand of an OR op
1c10: 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 57 48  erator in the WH
1c20: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 53  ERE clause..** S
1c30: 65 65 20 57 68 65 72 65 4f 72 53 65 74 20 66 6f  ee WhereOrSet fo
1c40: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1c50: 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f 0a 73 74 72  ormation .*/.str
1c60: 75 63 74 20 57 68 65 72 65 4f 72 43 6f 73 74 20  uct WhereOrCost 
1c70: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  {.  Bitmask prer
1c80: 65 71 3b 20 20 20 20 20 2f 2a 20 50 72 65 72 65  eq;     /* Prere
1c90: 71 75 69 73 69 74 65 73 20 2a 2f 0a 20 20 57 68  quisites */.  Wh
1ca0: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1cb0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e    /* Cost of run
1cc0: 6e 69 6e 67 20 74 68 69 73 20 73 75 62 71 75 65  ning this subque
1cd0: 72 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ry */.  WhereCos
1ce0: 74 20 6e 4f 75 74 3b 20 20 20 20 20 2f 2a 20 4e  t nOut;     /* N
1cf0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1d00: 20 66 6f 72 20 74 68 69 73 20 73 75 62 71 75 65   for this subque
1d10: 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ry */.};../* The
1d20: 20 57 68 65 72 65 4f 72 53 65 74 20 6f 62 6a 65   WhereOrSet obje
1d30: 63 74 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  ct holds a set o
1d40: 66 20 70 6f 73 73 69 62 6c 65 20 57 68 65 72 65  f possible Where
1d50: 4f 72 43 6f 73 74 73 20 74 68 61 74 0a 2a 2a 20  OrCosts that.** 
1d60: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
1d70: 65 20 73 75 62 71 75 65 72 79 28 73 29 20 6f 66  e subquery(s) of
1d80: 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65   OR-clause proce
1d90: 73 73 69 6e 67 2e 20 20 41 74 20 6d 6f 73 74 0a  ssing.  At most.
1da0: 2a 2a 20 66 61 76 6f 72 61 62 6c 65 20 4e 5f 4f  ** favorable N_O
1db0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dc0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1dd0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1de0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1df0: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e20: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e30: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e40: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e50: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e60: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e70: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e80: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1e90: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1ea0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1eb0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ec0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ed0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ee0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1ef0: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f00: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f10: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f20: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f30: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f40: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f50: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f60: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f70: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f80: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1f90: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fa0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fb0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fc0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fd0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1fe0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
1ff0: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2000: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2010: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2020: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2030: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2040: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2050: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2060: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2070: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2080: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
2090: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20a0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20b0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20c0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20d0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20e0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
20f0: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2100: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2110: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2120: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2130: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2140: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2150: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2160: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2170: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2180: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
2190: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21a0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21b0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21c0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21d0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21e0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
21f0: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2200: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2210: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2220: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2230: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2240: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2250: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2260: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2270: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2280: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
2290: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22a0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22b0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22c0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22d0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22e0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
22f0: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2300: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2310: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2320: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2330: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2340: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2350: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2360: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2370: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2380: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
2390: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23a0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23c0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23d0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23e0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
23f0: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2400: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2410: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2420: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2430: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2440: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2450: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2460: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2470: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2480: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
2490: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24a0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24b0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24c0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24d0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24e0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
24f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2500: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2510: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2520: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2530: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2540: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2550: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2560: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2570: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2580: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
2590: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25a0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25c0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25d0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25e0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
25f0: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2600: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2610: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2620: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2630: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2640: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2650: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2660: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2670: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2680: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
2690: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26a0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26b0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26c0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26d0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26e0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
26f0: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2700: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2710: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2720: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2730: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2740: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2750: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2760: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2770: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2780: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
2790: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27a0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27b0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27c0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27d0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27e0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
27f0: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2800: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2810: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2820: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2830: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2840: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2860: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2870: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2880: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
2890: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28a0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28b0: 61 67 20 61 73 20 74 68 65 20 54 45 52 4d 5f 4f  ag as the TERM_O
28c0: 52 49 4e 46 4f 20 73 65 74 20 61 6e 64 20 65 4f  RINFO set and eO
28d0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a  perator==WO_OR.*
28e0: 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 54  * and the WhereT
28f0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66 69  erm.u.pOrInfo fi
2900: 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 75  eld points to au
2910: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
2920: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  ion that.** is c
2930: 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20 74  ollected about t
2940: 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  he.**.** If a te
2950: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2960: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2970: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
2980: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
2990: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29a0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29b0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29c0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29d0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
29e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
29f0: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a00: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a10: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a20: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a30: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a40: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a50: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a60: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a70: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2a80: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2a90: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2aa0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ab0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ac0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2ad0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2ae0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2af0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b00: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b10: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b20: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b30: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b40: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b50: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b60: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b70: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2b80: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2b90: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2ba0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bb0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2bc0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bd0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2be0: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2bf0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c00: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c10: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c20: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c30: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c40: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c50: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c60: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c70: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2c80: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2c90: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2ca0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cb0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2cc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cd0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2ce0: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2cf0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d00: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d10: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d20: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d30: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d40: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d50: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d60: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d70: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2d80: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2d90: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2da0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2db0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2dc0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2dd0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2de0: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2df0: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e00: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e10: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e20: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e30: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e40: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e50: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e70: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2e80: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2e90: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ea0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2eb0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ec0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ed0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2ee0: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2ef0: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f00: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f10: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f20: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f30: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f40: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f50: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f60: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f70: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2f80: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2f90: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fa0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fb0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fc0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2fd0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2fe0: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
2ff0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3000: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3010: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3020: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3030: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3040: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3050: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3060: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
3080: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
3090: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
30e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
30f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3100: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3110: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3120: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3130: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3140: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3150: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3160: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3170: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
3180: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
3190: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
31e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
31f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3200: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3210: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3220: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3230: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3240: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3250: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3260: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3270: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
3280: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
3290: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
32e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
32f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3300: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3310: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3320: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3330: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3340: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3350: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3360: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3370: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3380: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
3390: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
33e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
33f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
3400: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
3410: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
3420: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
3430: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
3440: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
3450: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
3460: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
3470: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
3480: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
3490: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
34a0: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
34b0: 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ct is used as an
34c0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   iterator for lo
34d0: 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20  cating.** terms 
34e0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
34f0: 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65  use that are use
3500: 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79  ful to the query
3510: 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72   planner..*/.str
3520: 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a  uct WhereScan {.
3530: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3540: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
3550: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
3560: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
3570: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
3580: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
3590: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
35a0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
35b0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
35c0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
35d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
35e0: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
35f0: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
3600: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
3610: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
3620: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
3630: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
3640: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
3650: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
3660: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
3670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3680: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
3690: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
36a0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
36b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
36c0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
36d0: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
36e0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
36f0: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
3700: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
3710: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
3720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3730: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
3740: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
3750: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
3760: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
3770: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
3780: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
3790: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
37a0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
37b0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
37c0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37d0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
37e0: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
37f0: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
3800: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
3810: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
3820: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
3830: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
3840: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
3850: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
3860: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
3870: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
3880: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
3890: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
38a0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
38b0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
38c0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
38d0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
38e0: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
38f0: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
3900: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
3910: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
3920: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
3930: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
3940: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
3950: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
3960: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3970: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
3980: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
3990: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
39a0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
39b0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
39c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
39d0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
39e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
39f0: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
3a00: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
3a10: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
3a40: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
3a50: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
3a60: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
3a70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3a80: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3a90: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
3aa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ab0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
3ac0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
3ad0: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
3ae0: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
3af0: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
3b00: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
3b10: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
3b20: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
3b30: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
3b40: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
3b50: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
3b60: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
3b70: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
3b80: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
3b90: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
3ba0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
3bb0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
3bc0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3bd0: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3be0: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3bf0: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3c00: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3c10: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3c20: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3c30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3c40: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3c50: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3c60: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
3c70: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
3c80: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
3c90: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
3ca0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
3cb0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
3cc0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3cd0: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3ce0: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3cf0: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3d00: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3d10: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3d20: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3d30: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3d40: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3d50: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3d60: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d70: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3d80: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
3d90: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
3da0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
3db0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
3dc0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3dd0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3de0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3df0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3e00: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3e10: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3e20: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3e30: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3e40: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3e50: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3e60: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
3e70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
3e80: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
3e90: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
3ea0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
3eb0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
3ec0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3ed0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3ee0: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3ef0: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3f00: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3f10: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3f20: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3f30: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3f40: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3f50: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3f60: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
3f70: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
3f80: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
3f90: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
3fa0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
3fb0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
3fc0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3fd0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3fe0: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
3ff0: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
4000: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
4010: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
4020: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
4030: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
4040: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
4050: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
4060: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
4070: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
4080: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
4090: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
40a0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
40b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
40c0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
40d0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
40e0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
40f0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
4100: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
4110: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
4120: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
4130: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
4140: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
4150: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
4160: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
4170: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
4180: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
4190: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
41a0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
41b0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
41c0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
41d0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
41e0: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
41f0: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
4200: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
4210: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
4220: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
4230: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
4240: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
4250: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
4260: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
4270: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
4280: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
4290: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
42a0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
42b0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
42c0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
42d0: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
42e0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
4310: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
4320: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
4330: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
4340: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
4350: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
4360: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
4370: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
4380: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
4390: 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61 6c  apper holding al
43a0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
43b0: 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  eded.** to const
43c0: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ruct WhereLoop o
43d0: 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61 72  bjects for a par
43e0: 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a  ticular query..*
43f0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
4400: 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68  opBuilder {.  Wh
4410: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
4420: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4430: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
4440: 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68 65  s WHERE */.  Whe
4450: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
4460: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4470: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
4480: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4490: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f  erBy;       /* O
44a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
44b0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
44c0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
44d0: 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
44e0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  oop */.  WhereOr
44f0: 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20 20  Set *pOrSet;    
4500: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65 73     /* Record bes
4510: 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69 66  t loops here, if
4520: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 23 69 66   not NULL */.#if
4530: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4540: 45 5f 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b  E_STAT4.  Unpack
4550: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20  edRecord *pRec; 
4560: 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72      /* Probe for
4570: 20 73 74 61 74 34 20 28 69 66 20 72 65 71 75 69   stat4 (if requi
4580: 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  red) */.  int nR
4590: 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  ecValid;        
45a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
45b0: 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75   valid fields cu
45c0: 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20  rrently in pRec 
45d0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 4d 61  */.  tRowcnt nMa
45e0: 78 52 6f 77 63 6e 74 3b 20 20 20 20 20 20 20 2f  xRowcnt;       /
45f0: 2a 20 49 66 20 21 3d 30 2c 20 74 68 65 20 6d 61  * If !=0, the ma
4600: 78 69 6d 75 6d 20 65 73 74 69 6d 61 74 65 64 20  ximum estimated 
4610: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 23 65 6e  row count */.#en
4620: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
4630: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
4640: 72 6f 63 65 73 73 69 6e 67 20 72 6f 75 74 69 6e  rocessing routin
4650: 65 20 68 61 73 20 74 77 6f 20 68 61 6c 76 65 73  e has two halves
4660: 2e 20 20 54 68 65 0a 2a 2a 20 66 69 72 73 74 20  .  The.** first 
4670: 70 61 72 74 20 64 6f 65 73 20 74 68 65 20 73 74  part does the st
4680: 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
4690: 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 73 65   loop and the se
46a0: 63 6f 6e 64 0a 2a 2a 20 68 61 6c 66 20 64 6f 65  cond.** half doe
46b0: 73 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  s the tail of th
46c0: 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 41  e WHERE loop.  A
46d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a  n instance of.**
46e0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
46f0: 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  is returned by t
4700: 68 65 20 66 69 72 73 74 20 68 61 6c 66 20 61 6e  he first half an
4710: 64 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f  d passed.** into
4720: 20 74 68 65 20 73 65 63 6f 6e 64 20 68 61 6c 66   the second half
4730: 20 74 6f 20 67 69 76 65 20 73 6f 6d 65 20 63 6f   to give some co
4740: 6e 74 69 6e 75 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  ntinuity..**.** 
4750: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4760: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4770: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 74   the complete st
4780: 61 74 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  ate of the query
4790: 0a 2a 2a 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  .** planner..*/.
47a0: 73 74 72 75 63 74 20 57 68 65 72 65 49 6e 66 6f  struct WhereInfo
47b0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
47c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
47d0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
47e0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
47f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
4800: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
4810: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4820: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
4830: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  in */.  ExprList
4840: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
4850: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
4860: 59 20 63 6c 61 75 73 65 20 6f 72 20 4e 55 4c 4c  Y clause or NULL
4870: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4880: 70 52 65 73 75 6c 74 53 65 74 3b 20 20 20 20 20  pResultSet;     
4890: 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 44  /* Result set. D
48a0: 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 65 73  ISTINCT operates
48b0: 20 6f 6e 20 74 68 65 73 65 20 2a 2f 0a 20 20 57   on these */.  W
48c0: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73  hereLoop *pLoops
48d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ;        /* List
48e0: 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f   of all WhereLoo
48f0: 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 42  p objects */.  B
4900: 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 3b 20  itmask revMask; 
4910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
4920: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
4930: 6d 73 20 74 68 61 74 20 6e 65 65 64 20 72 65 76  ms that need rev
4940: 65 72 73 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  ersing */.  Wher
4950: 65 43 6f 73 74 20 6e 52 6f 77 4f 75 74 3b 20 20  eCost nRowOut;  
4960: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
4970: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
4980: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 75 31  put rows */.  u1
4990: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
49b0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 73 73   originally pass
49c0: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
49d0: 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 75  reBegin() */.  u
49e0: 38 20 62 4f 42 53 61 74 3b 20 20 20 20 20 20 20  8 bOBSat;       
49f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
4a00: 52 20 42 59 20 73 61 74 69 73 66 69 65 64 20 62  R BY satisfied b
4a10: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 75  y indices */.  u
4a20: 38 20 6f 6b 4f 6e 65 50 61 73 73 3b 20 20 20 20  8 okOnePass;    
4a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6b 20 74           /* Ok t
4a40: 6f 20 75 73 65 20 6f 6e 65 2d 70 61 73 73 20 61  o use one-pass a
4a50: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 55 50 44  lgorithm for UPD
4a60: 41 54 45 2f 44 45 4c 45 54 45 20 2a 2f 0a 20 20  ATE/DELETE */.  
4a70: 75 38 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  u8 untestedTerms
4a80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ;         /* Not
4a90: 20 61 6c 6c 20 57 48 45 52 45 20 74 65 72 6d 73   all WHERE terms
4aa0: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 6f 75 74   resolved by out
4ab0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20  er loop */.  u8 
4ac0: 65 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  eDistinct;      
4ad0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
4ae0: 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49   the WHERE_DISTI
4af0: 4e 43 54 5f 2a 20 76 61 6c 75 65 73 20 62 65 6c  NCT_* values bel
4b00: 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 4c 65 76 65  ow */.  u8 nLeve
4b10: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4b20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
4b30: 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20  ested loop */.  
4b40: 69 6e 74 20 69 54 6f 70 3b 20 20 20 20 20 20 20  int iTop;       
4b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4b60: 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e 67 20   very beginning 
4b70: 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
4b80: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  p */.  int iCont
4b90: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  inue;           
4ba0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4bb0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4bc0: 65 78 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ext record */.  
4bd0: 69 6e 74 20 69 42 72 65 61 6b 3b 20 20 20 20 20  int iBreak;     
4be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bf0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4c00: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4c10: 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4e 51  */.  int savedNQ
4c20: 75 65 72 79 4c 6f 6f 70 3b 20 20 20 20 20 20 2f  ueryLoop;      /
4c30: 2a 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  * pParse->nQuery
4c40: 4c 6f 6f 70 20 6f 75 74 73 69 64 65 20 74 68 65  Loop outside the
4c50: 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20   WHERE loop */. 
4c60: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 4d   WhereMaskSet sM
4c70: 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 4d 61  askSet;    /* Ma
4c80: 70 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  p cursor numbers
4c90: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
4ca0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 57    WhereClause sW
4cb0: 43 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  C;          /* D
4cc0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
4cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4ce0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
4cf0: 20 61 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20   a[1];          
4d00: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
4d10: 62 6f 75 74 20 65 61 63 68 20 6e 65 73 74 20 6c  bout each nest l
4d20: 6f 6f 70 20 69 6e 20 57 48 45 52 45 20 2a 2f 0a  oop in WHERE */.
4d30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
4d40: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
4d50: 74 6f 72 73 20 6f 6e 20 57 68 65 72 65 54 65 72  tors on WhereTer
4d60: 6d 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73  m objects.  Thes
4d70: 65 20 61 72 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65  e are all.** ope
4d80: 72 61 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  rators that are 
4d90: 6f 66 20 69 6e 74 65 72 65 73 74 20 74 6f 20 74  of interest to t
4da0: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
4db0: 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63  .  An.** OR-ed c
4dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
4dd0: 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62  ese values can b
4de0: 65 20 75 73 65 64 20 77 68 65 6e 20 73 65 61 72  e used when sear
4df0: 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 70 61 72  ching for.** par
4e00: 74 69 63 75 6c 61 72 20 57 68 65 72 65 54 65 72  ticular WhereTer
4e10: 6d 73 20 77 69 74 68 69 6e 20 61 20 57 68 65 72  ms within a Wher
4e20: 65 43 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66  eClause..*/.#def
4e30: 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 30 78  ine WO_IN     0x
4e40: 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45  001.#define WO_E
4e50: 51 20 20 20 20 20 30 78 30 30 32 0a 23 64 65 66  Q     0x002.#def
4e60: 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57  ine WO_LT     (W
4e70: 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f  O_EQ<<(TK_LT-TK_
4e80: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
4e90: 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LE     (WO_EQ<<(
4ea0: 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LE-TK_EQ)).#d
4eb0: 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20  efine WO_GT     
4ec0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54  (WO_EQ<<(TK_GT-T
4ed0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4ee0: 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GE     (WO_EQ<
4ef0: 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_GE-TK_EQ)).
4f00: 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48  #define WO_MATCH
4f10: 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e 65 20    0x040.#define 
4f20: 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a  WO_ISNULL 0x080.
4f30: 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20  #define WO_OR   
4f40: 20 20 30 78 31 30 30 20 20 20 20 20 20 20 2f 2a    0x100       /*
4f50: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   Two or more OR-
4f60: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
4f70: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e  */.#define WO_AN
4f80: 44 20 20 20 20 30 78 32 30 30 20 20 20 20 20 20  D    0x200      
4f90: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
4fa0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65  AND-connected te
4fb0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
4fc0: 4f 5f 45 51 55 49 56 20 20 30 78 34 30 30 20 20  O_EQUIV  0x400  
4fd0: 20 20 20 20 20 2f 2a 20 4f 66 20 74 68 65 20 66       /* Of the f
4fe0: 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63  orm A==B, both c
4ff0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e  olumns */.#defin
5000: 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30  e WO_NOOP   0x80
5010: 30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  0       /* This 
5020: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65  term does not re
5030: 73 74 72 69 63 74 20 73 65 61 72 63 68 20 73 70  strict search sp
5040: 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ace */..#define 
5050: 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20  WO_ALL    0xfff 
5060: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
5070: 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f   all possible WO
5080: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  _* values */.#de
5090: 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30  fine WO_SINGLE 0
50a0: 78 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61  x0ff       /* Ma
50b0: 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f  sk of all non-co
50c0: 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75  mpound WO_* valu
50d0: 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  es */../*.** The
50e0: 73 65 20 61 72 65 20 64 65 66 69 6e 69 74 69 6f  se are definitio
50f0: 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
5100: 65 20 57 68 65 72 65 4c 6f 6f 70 2e 77 73 46 6c  e WhereLoop.wsFl
5110: 61 67 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 54 68  ags field..** Th
5120: 65 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  e particular com
5130: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 62 69 74 73  bination of bits
5140: 20 69 6e 20 65 61 63 68 20 57 68 65 72 65 4c 6f   in each WhereLo
5150: 6f 70 20 68 65 6c 70 20 74 6f 0a 2a 2a 20 64 65  op help to.** de
5160: 74 65 72 6d 69 6e 65 20 74 68 65 20 61 6c 67 6f  termine the algo
5170: 72 69 74 68 6d 20 74 68 61 74 20 57 68 65 72 65  rithm that Where
5180: 4c 6f 6f 70 20 72 65 70 72 65 73 65 6e 74 73 2e  Loop represents.
5190: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
51a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30  E_COLUMN_EQ    0
51b0: 78 30 30 30 30 30 30 30 31 20 20 2f 2a 20 78 3d  x00000001  /* x=
51c0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
51d0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
51e0: 47 45 20 30 78 30 30 30 30 30 30 30 32 20 20 2f  GE 0x00000002  /
51f0: 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  * x<EXPR and/or 
5200: 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x>EXPR */.#defin
5210: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  e WHERE_COLUMN_I
5220: 4e 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20  N    0x00000004 
5230: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
5240: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5250: 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30  COLUMN_NULL  0x0
5260: 30 30 30 30 30 30 38 20 20 2f 2a 20 78 20 49 53  0000008  /* x IS
5270: 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65   NULL */.#define
5280: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
5290: 54 20 20 20 30 78 30 30 30 30 30 30 30 66 20 20  T   0x0000000f  
52a0: 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65 20 57 48  /* Any of the WH
52b0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78 78 20 76  ERE_COLUMN_xxx v
52c0: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
52d0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
52e0: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 20      0x00000010  
52f0: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d  /* x<EXPR or x<=
5300: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
5310: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5320: 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78  _BTM_LIMIT    0x
5330: 30 30 30 30 30 30 32 30 20 20 2f 2a 20 78 3e 45  00000020  /* x>E
5340: 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63  XPR or x>=EXPR c
5350: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
5360: 66 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f  fine WHERE_BOTH_
5370: 4c 49 4d 49 54 20 20 20 30 78 30 30 30 30 30 30  LIMIT   0x000000
5380: 33 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58  30  /* Both x>EX
5390: 50 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f  PR and x<EXPR */
53a0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
53b0: 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30  DX_ONLY     0x00
53c0: 30 30 30 30 34 30 20 20 2f 2a 20 55 73 65 20 69  000040  /* Use i
53d0: 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74  ndex only - omit
53e0: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
53f0: 65 20 57 48 45 52 45 5f 49 50 4b 20 20 20 20 20  e WHERE_IPK     
5400: 20 20 20 20 20 30 78 30 30 30 30 30 31 30 30 20       0x00000100 
5410: 20 2f 2a 20 78 20 69 73 20 74 68 65 20 49 4e 54   /* x is the INT
5420: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5430: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5440: 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30  E_INDEXED      0
5450: 78 30 30 30 30 30 32 30 30 20 20 2f 2a 20 57 68  x00000200  /* Wh
5460: 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72 65 65 2e  ereLoop.u.btree.
5470: 70 49 6e 64 65 78 20 69 73 20 76 61 6c 69 64 20  pIndex is valid 
5480: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5490: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
54a0: 30 30 30 30 30 34 30 30 20 20 2f 2a 20 57 68 65  00000400  /* Whe
54b0: 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62 20 69 73  reLoop.u.vtab is
54c0: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
54d0: 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  e WHERE_IN_ABLE 
54e0: 20 20 20 20 20 30 78 30 30 30 30 30 38 30 30 20       0x00000800 
54f0: 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70   /* Able to supp
5500: 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  ort an IN operat
5510: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  or */.#define WH
5520: 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20 20 20 20  ERE_ONEROW      
5530: 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20   0x00001000  /* 
5540: 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20  Selects no more 
5550: 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a  than one row */.
5560: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55  #define WHERE_MU
5570: 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 30 30 30  LTI_OR     0x000
5580: 30 32 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69  02000  /* OR usi
5590: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69  ng multiple indi
55a0: 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ces */.#define W
55b0: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20  HERE_AUTO_INDEX 
55c0: 20 20 30 78 30 30 30 30 34 30 30 30 20 20 2f 2a    0x00004000  /*
55d0: 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72   Uses an ephemer
55e0: 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 2f 2a  al index */.../*
55f0: 20 43 6f 6e 76 65 72 74 20 61 20 57 68 65 72 65   Convert a Where
5600: 43 6f 73 74 20 76 61 6c 75 65 20 28 31 30 20 74  Cost value (10 t
5610: 69 6d 65 73 20 6c 6f 67 32 28 58 29 29 20 69 6e  imes log2(X)) in
5620: 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72 20 76  to its integer v
5630: 61 6c 75 65 20 58 2e 0a 2a 2a 20 41 20 72 6f 75  alue X..** A rou
5640: 67 68 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  gh approximation
5650: 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 76   is used.  The v
5660: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
5670: 20 6e 6f 74 20 65 78 61 63 74 2e 0a 2a 2f 0a 73   not exact..*/.s
5680: 74 61 74 69 63 20 75 36 34 20 77 68 65 72 65 43  tatic u64 whereC
5690: 6f 73 74 54 6f 49 6e 74 28 57 68 65 72 65 43 6f  ostToInt(WhereCo
56a0: 73 74 20 78 29 7b 0a 20 20 75 36 34 20 6e 3b 0a  st x){.  u64 n;.
56b0: 20 20 69 66 28 20 78 3c 31 30 20 29 20 72 65 74    if( x<10 ) ret
56c0: 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 78 25 31  urn 1;.  n = x%1
56d0: 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b 0a 20 20  0;.  x /= 10;.  
56e0: 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20 2d 3d 20  if( n>=5 ) n -= 
56f0: 32 3b 0a 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  2;.  else if( n>
5700: 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a 20 20 69  =1 ) n -= 1;.  i
5710: 66 28 20 78 3e 3d 33 20 29 20 72 65 74 75 72 6e  f( x>=3 ) return
5720: 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29 3b 0a 20   (n+8)<<(x-3);. 
5730: 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3e 3e 28   return (n+8)>>(
5740: 33 2d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  3-x);.}../*.** R
5750: 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61  eturn the estima
5760: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  ted number of ou
5770: 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61  tput rows from a
5780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f   WHERE clause.*/
5790: 0a 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72  .u64 sqlite3Wher
57a0: 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
57b0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
57c0: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 68 65  o){.  return whe
57d0: 72 65 43 6f 73 74 54 6f 49 6e 74 28 70 57 49 6e  reCostToInt(pWIn
57e0: 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 7d 0a  fo->nRowOut);.}.
57f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e  ./*.** Return on
5800: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
5810: 49 53 54 49 4e 43 54 5f 78 78 78 78 78 20 76 61  ISTINCT_xxxxx va
5820: 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lues to indicate
5830: 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20 57 48 45   how this.** WHE
5840: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
5850: 73 20 6f 75 74 70 75 74 73 20 66 6f 72 20 44 49  s outputs for DI
5860: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
5870: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
5880: 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
5890: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
58a0: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
58b0: 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b  Info->eDistinct;
58c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
58d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
58e0: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
58f0: 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52 20  s rows in ORDER 
5900: 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20 52 65 74  BY order..** Ret
5910: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
5920: 20 6f 75 74 70 75 74 20 6e 65 65 64 73 20 74 6f   output needs to
5930: 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2f 0a 69   be sorted..*/.i
5940: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
5950: 73 4f 72 64 65 72 65 64 28 57 68 65 72 65 49 6e  sOrdered(WhereIn
5960: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5970: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f  eturn pWInfo->bO
5980: 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  BSat!=0;.}../*.*
5990: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
59a0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
59b0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
59c0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
59d0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
59e0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
59f0: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
5a00: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
5a10: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
5a20: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
5a30: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
5a40: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  turn pWInfo->iCo
5a50: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
5a60: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
5a70: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
5a80: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
5a90: 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a 2a  order to break.*
5aa0: 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52 45  * out of a WHERE
5ab0: 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
5ac0: 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
5ad0: 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a  abel(WhereInfo *
5ae0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
5af0: 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  n pWInfo->iBreak
5b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5b10: 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55 50 44  n TRUE if an UPD
5b20: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
5b30: 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70 65 72  atement can oper
5b40: 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 0a  ate directly on.
5b50: 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20 72 65  ** the rowids re
5b60: 74 75 72 6e 65 64 20 62 79 20 61 20 57 48 45 52  turned by a WHER
5b70: 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74 75 72  E clause.  Retur
5b80: 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69 6e 67  n FALSE if doing
5b90: 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   an.** UPDATE or
5ba0: 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20 63 68   DELETE might ch
5bb0: 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e 74 20  ange subsequent 
5bc0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 73  WHERE clause res
5bd0: 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ults..*/.int sql
5be0: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
5bf0: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
5c00: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
5c10: 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
5c20: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  s;.}../*.** Move
5c30: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5c40: 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a  pSrc into pDest.
5c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5c60: 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65  hereOrMove(Where
5c70: 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68  OrSet *pDest, Wh
5c80: 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b  ereOrSet *pSrc){
5c90: 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53  .  pDest->n = pS
5ca0: 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  rc->n;.  memcpy(
5cb0: 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e  pDest->a, pSrc->
5cc0: 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65  a, pDest->n*size
5cd0: 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29  of(pDest->a[0]))
5ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
5cf0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70  o insert a new p
5d00: 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74  rerequisite/cost
5d10: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5d20: 57 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e  WhereOrSet pSet.
5d30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65  .**.** The new e
5d40: 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77  ntry might overw
5d50: 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
5d60: 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69   entry, or it mi
5d70: 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64  ght be.** append
5d80: 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ed, or it might 
5d90: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44  be discarded.  D
5da0: 6f 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68  o whatever is th
5db0: 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a  e right thing.**
5dc0: 20 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65   so that pSet ke
5dd0: 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53  eps the N_OR_COS
5de0: 54 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73  T best entries s
5df0: 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73  een so far..*/.s
5e00: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f  tatic int whereO
5e10: 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  rInsert(.  Where
5e20: 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20  OrSet *pSet,    
5e30: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72    /* The WhereOr
5e40: 53 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65  Set to be update
5e50: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
5e60: 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a  rereq,        /*
5e70: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   Prerequisites o
5e80: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
5e90: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
5ea0: 52 75 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  Run,        /* R
5eb0: 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e  un-cost of the n
5ec0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68  ew entry */.  Wh
5ed0: 65 72 65 43 6f 73 74 20 6e 4f 75 74 20 20 20 20  ereCost nOut    
5ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5ef0: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
5f00: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29  e new entry */.)
5f10: 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65  {.  u16 i;.  Whe
5f20: 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66  reOrCost *p;.  f
5f30: 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d  or(i=pSet->n, p=
5f40: 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSet->a; i>0; i-
5f50: 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, p++){.    if(
5f60: 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26   rRun<=p->rRun &
5f70: 26 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70  & (prereq & p->p
5f80: 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29  rereq)==prereq )
5f90: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  {.      goto whe
5fa0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b  reOrInsert_done;
5fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5fc0: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20  ->rRun<=rRun && 
5fd0: 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65  (p->prereq & pre
5fe0: 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
5ff0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6000: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
6010: 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f  f( pSet->n<N_OR_
6020: 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20  COST ){.    p = 
6030: 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e  &pSet->a[pSet->n
6040: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74  ++];.    p->nOut
6050: 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65   = nOut;.  }else
6060: 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e  {.    p = pSet->
6070: 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  a;.    for(i=1; 
6080: 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pSet->n; i++){
6090: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52  .      if( p->rR
60a0: 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52  un>pSet->a[i].rR
60b0: 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61  un ) p = pSet->a
60c0: 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + i;.    }.    
60d0: 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75  if( p->rRun<=rRu
60e0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
60f0: 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f  }.whereOrInsert_
6100: 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65  done:.  p->prere
6110: 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d  q = prereq;.  p-
6120: 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20  >rRun = rRun;.  
6130: 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  if( p->nOut>nOut
6140: 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75   ) p->nOut = nOu
6150: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
6160: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6170: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
6180: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
6190: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
61a0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
61b0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
61c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
61d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
61e0: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
61f0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
6200: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6210: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
6220: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63  ERE processing c
6230: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70  ontext */.){.  p
6240: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WC->pWInfo = pWI
6250: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  nfo;.  pWC->pOut
6260: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
6270: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
6280: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
6290: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
62a0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
62b0: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
62c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
62d0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
62e0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
62f0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
6300: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
6310: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
6320: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6330: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
6340: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
6350: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
6360: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6370: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
6380: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
6390: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
63a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
63b0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
63c0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
63d0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
63e0: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
63f0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
6400: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6410: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
6420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
6430: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
6440: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
6450: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
6460: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
6480: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
6490: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
64a0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
64b0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
64c0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
64d0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
64e0: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
64f0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
6500: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
6510: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
6520: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
6530: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
6540: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
6550: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6560: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
6570: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
6580: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
6590: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
65a0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
65b0: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
65c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
65d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
65e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
65f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
6600: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
6610: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
6620: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
6630: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
6640: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
6650: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
6660: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
6670: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6680: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
6690: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
66a0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
66b0: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
66c0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
66d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
66e0: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
6700: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
6710: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
6720: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
6730: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
6740: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
6750: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
6760: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
6770: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
6780: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
6790: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
67a0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
67b0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
67c0: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
67d0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
67e0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
67f0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
6800: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
6810: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
6820: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
6830: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
6840: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
6850: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
6860: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6870: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
6880: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
6890: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
68a0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
68b0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
68c0: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
68d0: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
68e0: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
68f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
6900: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
6910: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
6920: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
6930: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
6940: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
6950: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
6960: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
6970: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
6980: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
6990: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
69a0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
69b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
69c0: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
69d0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
69e0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
69f0: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
6a00: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
6a10: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
6a20: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
6a30: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
6a40: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
6a50: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
6a60: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6a70: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
6a80: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
6a90: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
6aa0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
6ab0: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
6ac0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
6ad0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
6ae0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
6af0: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
6b00: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
6b10: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
6b20: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
6b30: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6b40: 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20  IRTUAL );.  if( 
6b50: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
6b60: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
6b70: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
6b80: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
6b90: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
6ba0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
6bb0: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
6bc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6bd0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
6be0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
6bf0: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
6c00: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
6c10: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
6c20: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
6c30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6c40: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6c50: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6c60: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
6c70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6c80: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
6c90: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
6ca0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
6cb0: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
6cc0: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
6cd0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6cf0: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
6d00: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
6d10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6d20: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
6d30: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
6d40: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
6d50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
6d60: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
6d70: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
6d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
6d90: 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70  pCollate(p);.  p
6da0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20  Term->wtFlags = 
6db0: 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d  wtFlags;.  pTerm
6dc0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
6dd0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
6de0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  -1;.  return idx
6df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6e00: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
6e10: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
6e20: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
6e30: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
6e40: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
6e50: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
6e60: 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  y the AND operat
6e70: 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  or or some other
6e80: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65  .** operator spe
6e90: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70  cified in the op
6ea0: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65   parameter.  The
6eb0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
6ec0: 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c  ucture.** is fil
6ed0: 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72  led with pointer
6ee0: 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  s to subexpressi
6ef0: 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ons.  For exampl
6f00: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52  e:.**.**    WHER
6f10: 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e  E  a=='hello' AN
6f20: 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29  D coalesce(b,11)
6f30: 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64  <10 AND (c+12!=d
6f40: 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20   OR c==22).**   
6f50: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
6f60: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
6f70: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
6f80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
6f90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  **            sl
6fa0: 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  ot[0]           
6fb0: 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20   slot[1]        
6fc0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a         slot[2].*
6fd0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
6fe0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
6ff0: 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74  n pExpr is unalt
7000: 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20  ered.  All this 
7010: 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
7020: 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65  is make slot[] e
7030: 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20  ntries point to 
7040: 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74  substructure wit
7050: 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a  hin pExpr..**.**
7060: 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   In the previous
7070: 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e   sentence and in
7080: 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73   the diagram, "s
7090: 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f  lot[]" refers to
70a0: 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61  .** the WhereCla
70b0: 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20  use.a[] array.  
70c0: 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79  The slot[] array
70d0: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
70e0: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
70f0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
7100: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
7110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
7120: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
7130: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
7140: 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20  pExpr, u8 op){. 
7150: 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20   pWC->op = op;. 
7160: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7170: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
7180: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
7190: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
71a0: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
71b0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
71c0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
71d0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
71e0: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
71f0: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
7200: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
7210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
7220: 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b  lize a WhereMask
7230: 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64  Set object.*/.#d
7240: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
7250: 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a  t(P)  (P)->n=0..
7260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7270: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
7280: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
7290: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
72a0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
72b0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
72c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
72d0: 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65  sk getMask(Where
72e0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
72f0: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
7300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
7310: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c  rt( pMaskSet->n<
7320: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74  =(int)sizeof(Bit
7330: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
7340: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
7350: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
7360: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
7370: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
7380: 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b       return MASK
7390: 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(i);.    }.  
73a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
73b0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
73c0: 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72  new mask for cur
73d0: 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a  sor iCursor..**.
73e0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
73f0: 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65  cursor per table
7400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7410: 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  use.  The number
7420: 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e   of.** tables in
7430: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7440: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61   is limited by a
7450: 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74   test early in t
7460: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  he.** sqlite3Whe
7470: 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e  reBegin() routin
7480: 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74  e.  So we know t
7490: 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74  hat the pMaskSet
74a0: 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  ->ix[].** array 
74b0: 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66  will never overf
74c0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  low..*/.static v
74d0: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57  oid createMask(W
74e0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
74f0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
7500: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
7510: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72  MaskSet->n < Arr
7520: 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d  aySize(pMaskSet-
7530: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
7540: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
7550: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
7560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
7570: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 20 28 72 65  routine walk (re
7580: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
7590: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
75a0: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
75b0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
75c0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
75d0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
75e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
75f0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7600: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
7610: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7620: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
7630: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
7640: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
7650: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
7660: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
7670: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
7680: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
7690: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
76a0: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
76b0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
76c0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
76d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
76e0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
76f0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
7700: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
7710: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
7720: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
7730: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
7740: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7750: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
7760: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
7770: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7780: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
7790: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
77a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
77b0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
77c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
77d0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
77e0: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
77f0: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
7800: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
7810: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
7820: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
7830: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
7840: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7850: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
7860: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
7870: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
7880: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
7890: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
78a0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
78b0: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
78c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
78d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
78f0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7900: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
7910: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7920: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7930: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
7940: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
7950: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
7960: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7970: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
7980: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
7990: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
79a0: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
79b0: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
79c0: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
79d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
79e0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
79f0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
7a00: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
7a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7a20: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
7a30: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7a40: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7a50: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7a60: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
7a70: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
7a80: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7a90: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
7aa0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7ab0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7ac0: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
7ad0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
7ae0: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
7af0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
7b00: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
7b10: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7b20: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
7b30: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7b40: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7b50: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
7b60: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
7b70: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7b80: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
7b90: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
7ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
7bb0: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
7bc0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
7bd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7be0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
7bf0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
7c00: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
7c10: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
7c20: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
7c30: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
7c40: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
7c50: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
7c60: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
7c70: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
7c80: 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20  , "IN", and "IS 
7c90: 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL".*/.static 
7ca0: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
7cb0: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
7cc0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
7cd0: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
7ce0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
7cf0: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
7d00: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
7d10: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
7d20: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
7d30: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
7d40: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
7d50: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
7d60: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
7d70: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
7d80: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
7d90: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
7da0: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
7db0: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
7dc0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
7dd0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
7de0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
7df0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
7e00: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
7e10: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
7e20: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
7e30: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
7e40: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
7e50: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
7e60: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
7e70: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
7e80: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
7e90: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
7ea0: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
7eb0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
7ec0: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
7ed0: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
7ee0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
7ef0: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
7f00: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
7f10: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
7f20: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
7f30: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
7f40: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
7f50: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7f60: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
7f70: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
7f80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
7f90: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
7fa0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
7fb0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
7fc0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
7fd0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
7fe0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
7ff0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
8000: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8010: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
8020: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8030: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
8040: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
8050: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
8060: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
8070: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
8080: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
8090: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
80a0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
80b0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
80c0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
80d0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
80e0: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
80f0: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
8100: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
8110: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
8120: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
8130: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
8140: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
8150: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
8160: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
8170: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
8180: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
8190: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
81a0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
81b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
81c0: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
81d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
81e0: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
81f0: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
8200: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
8210: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8220: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
8230: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
8240: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
8250: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8260: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
8270: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
8280: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
8290: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
82a0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
82b0: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
82c0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
82d0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
82e0: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
82f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
8300: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
8310: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
8320: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
8330: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
8340: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
8350: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
8360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
8370: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
8380: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
8390: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
83a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
83b0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
83c0: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
83d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
83e0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
83f0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
8400: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
8410: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
8420: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
8430: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
8440: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
8450: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
8460: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
8470: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
8480: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
8490: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
84a0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
84b0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
84c0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
84d0: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
84e0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
84f0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
8500: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
8510: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8520: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
8530: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
8540: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
8550: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
8560: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8570: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
8580: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
8590: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
85a0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
85b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
85c0: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
85d0: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
85e0: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
85f0: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
8600: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
8610: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
8620: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
8630: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
8640: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8650: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
8660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
8670: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
8680: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
8690: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
86a0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
86b0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
86c0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
86d0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
86e0: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
86f0: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
8700: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
8710: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
8720: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
8730: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
8740: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
8750: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
8760: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
8770: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
8780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8790: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
87a0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
87b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
87c0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
87d0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
87e0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
87f0: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
8800: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
8810: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
8820: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
8830: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
8840: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
8850: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
8860: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
8870: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
8880: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
8890: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
88a0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
88b0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
88c0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
88d0: 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  ng */..  while( 
88e0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70  pScan->iEquiv<=p
88f0: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a  Scan->nEquiv ){.
8900: 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e      iCur = pScan
8910: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
8920: 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69  iEquiv-2];.    i
8930: 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e  Column = pScan->
8940: 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45  aEquiv[pScan->iE
8950: 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69  quiv-1];.    whi
8960: 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e  le( (pWC = pScan
8970: 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20  ->pWC)!=0 ){.   
8980: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
8990: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
89a0: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
89b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
89c0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
89d0: 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d  r==iCur && pTerm
89e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
89f0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8a00: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8a10: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8a20: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
8a30: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
8a40: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
8a50: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20  pScan->aEquiv). 
8a60: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
8a70: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
8a80: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
8a90: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
8aa0: 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45  ollate(pTerm->pE
8ab0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8ac0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8ad0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
8ae0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UMN );.         
8af0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
8b00: 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d  can->nEquiv; j+=
8b10: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
8b20: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71    if( pScan->aEq
8b30: 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  uiv[j]==pX->iTab
8b40: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
8b50: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75    && pScan->aEqu
8b60: 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f  iv[j+1]==pX->iCo
8b70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8b80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
8bc0: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
8bd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8be0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8bf0: 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  ] = pX->iTable;.
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8c10: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
8c20: 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pX->iColumn;.
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8c40: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32  can->nEquiv += 2
8c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8c60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8c70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
8c80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53  ->eOperator & pS
8c90: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20  can->opMask)!=0 
8ca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
8cb0: 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66  * Verify the aff
8cc0: 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74  inity and collat
8cd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74  ing sequence mat
8ce0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
8cf0: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f    if( pScan->zCo
8d00: 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d  llName && (pTerm
8d10: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8d20: 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  _ISNULL)==0 ){. 
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c               Col
8d40: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8d50: 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65             Parse
8d60: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
8d70: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
8d90: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
8da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8db0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
8dc0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70  AffinityOk(pX, p
8dd0: 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b  Scan->idxaff) ){
8de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8df0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8e00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e10: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8e20: 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
8e30: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
8e40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
8e50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
8e60: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
8ea0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8ec0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
8ed0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
8ee0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
8ef0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
8f00: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
8f10: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e  ll->zName, pScan
8f20: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a  ->zCollName) ){.
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8f70: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8f80: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8f90: 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Q)!=0.          
8fa0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
8fb0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8fc0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
8fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8fe0: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
8ff0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20  an->aEquiv[0].  
9000: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
9010: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e  ->iColumn==pScan
9020: 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20  ->aEquiv[1].    
9030: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
9040: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9050: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
9060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
9070: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
9080: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9090: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
90a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
90b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
90c0: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
90d0: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
90e0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
90f0: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
9100: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
9110: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
9120: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20  Scan->iEquiv += 
9130: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
9140: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
9150: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
9160: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
9170: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
9180: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
9190: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
91a0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
91b0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
91c0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
91d0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
91e0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
91f0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
9200: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
9210: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
9220: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9230: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
9240: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
9250: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
9260: 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  .  The <op> must
9270: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
9280: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
9290: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
92a0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
92b0: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
92c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
92d0: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
92e0: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
92f0: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
9300: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
9310: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
9320: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
9330: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
9340: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
9350: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
9360: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
9370: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
9380: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
9390: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
93a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
93b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
93c0: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
93d0: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
93e0: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
93f0: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
9400: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
9410: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
9420: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
9430: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
9440: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
9450: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
9460: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
9470: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9480: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
9490: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
94a0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
94b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94d0: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
94e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
94f0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
9500: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
9510: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
9520: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
9530: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
9540: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
9550: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
9560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
9570: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
9580: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
9590: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   */.){.  int j;.
95a0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
95b0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
95c0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
95d0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
95e0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
95f0: 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64  = pWC;.  if( pId
9600: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
9610: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
9620: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
9630: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
9640: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
9650: 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e   for(j=0; pIdx->
9660: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f  aiColumn[j]!=iCo
9670: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
9680: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
9690: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
96a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
96b0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
96c0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
96d0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
96e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
96f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
9700: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
9710: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
9720: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
9730: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
9740: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
9750: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
9760: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
9770: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
9780: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
9790: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
97a0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
97b0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
97c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
97d0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
97e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
97f0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
9800: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9810: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
9820: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
9830: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
9840: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
9850: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
9860: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
9870: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
9880: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
9890: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
98a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
98b0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
98c0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
98d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
98e0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
98f0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
9900: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
9910: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
9920: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9930: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
9940: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
9950: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
9960: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
9970: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
9980: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
9990: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
99a0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
99b0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
99c0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
99d0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
99e0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
99f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
9a00: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
9a10: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
9a20: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
9a30: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
9a40: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
9a50: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
9a60: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
9a70: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
9a80: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
9a90: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
9aa0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
9ab0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
9ac0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
9ad0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
9ae0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
9af0: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
9b00: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
9b10: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
9b20: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
9b30: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
9b40: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
9b50: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
9b60: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
9b70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9b80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9b90: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
9ba0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
9bb0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
9bc0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
9bd0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
9be0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
9bf0: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
9c00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
9c10: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
9c20: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
9c30: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
9c40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
9c50: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
9c60: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
9c70: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
9c80: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9c90: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
9ca0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
9cb0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
9cc0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
9cd0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
9ce0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
9cf0: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
9d00: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
9d10: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
9d20: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
9d30: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
9d40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9d50: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
9d60: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
9d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
9d80: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
9d90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
9da0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
9db0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
9dc0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
9dd0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
9de0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
9df0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
9e00: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
9e10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
9e20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
9e30: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
9e40: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
9e50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
9e60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
9e70: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
9e80: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
9e90: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
9ea0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
9eb0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
9ec0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
9ed0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
9ee0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
9ef0: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
9f00: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
9f10: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
9f20: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
9f30: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
9f40: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
9f50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
9f60: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
9f70: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
9f80: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
9f90: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
9fa0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
9fb0: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
9fc0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
9fd0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
9fe0: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
9ff0: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
a000: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
a010: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
a020: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a030: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
a040: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
a050: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
a060: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
a070: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
a080: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
a090: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
a0a0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
a0b0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
a0c0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
a0d0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
a0e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
a0f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
a100: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
a110: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a120: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a130: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
a140: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
a150: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
a160: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
a170: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
a180: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
a190: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
a1a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a1b0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a1c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
a1d0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
a1e0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
a1f0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
a200: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
a210: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
a220: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
a230: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
a240: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
a250: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
a260: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
a270: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
a280: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
a290: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
a2a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
a2b0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
a2c0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
a2d0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
a2e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a2f0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a300: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
a310: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a320: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
a330: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
a340: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
a350: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
a360: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a370: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
a380: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
a390: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
a3a0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
a3b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
a3c0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
a3d0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
a3e0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
a3f0: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
a400: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
a410: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
a420: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
a430: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
a440: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
a450: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
a460: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
a470: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
a480: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
a490: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
a4a0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
a4b0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
a4c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
a4e0: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
a4f0: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
a500: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
a530: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
a540: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a560: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
a570: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
a580: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
a590: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
a5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
a5b0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
a5c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a5d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a5e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a5f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
a600: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
a610: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
a640: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
a650: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
a660: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
a670: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
a680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a690: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a6a0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
a6b0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
a6c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
a6d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
a6e0: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
a6f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a700: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
a710: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
a720: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
a730: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
a740: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
a750: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
a760: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
a770: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
a780: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
a790: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
a7a0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
a7b0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
a7c0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
a7d0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
a7e0: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
a7f0: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
a800: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a810: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
a820: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
a830: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
a840: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
a850: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
a860: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
a870: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
a880: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
a890: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
a8a0: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
a8b0: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
a8c0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
a8d0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
a8e0: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
a8f0: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
a900: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
a910: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
a920: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
a930: 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
a940: 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  dValue(pReprepar
a950: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
a960: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
a970: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
a980: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
a990: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
a9a0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
a9b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
a9c0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
a9d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a9e0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
a9f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
aa00: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
aa10: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
aa20: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
aa30: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
aa40: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
aa50: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
aa60: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
aa70: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
aa80: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
aa90: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
aaa0: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
aab0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
aac0: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
aad0: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
aae0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
aaf0: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
ab00: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
ab10: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
ab20: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
ab30: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
ab40: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
ab50: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
ab60: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
ab70: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
ab80: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
ab90: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
aba0: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
abb0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
abc0: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
abd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
abe0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
abf0: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
ac00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ac10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac20: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
ac30: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ac40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
ac50: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
ac60: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
ac70: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
ac80: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
ac90: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
aca0: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
acb0: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
acc0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
acd0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
ace0: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
acf0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
ad00: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
ad10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
ad20: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
ad30: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
ad40: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
ad50: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
ad60: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
ad70: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
ad80: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
ad90: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
ada0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
adb0: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
adc0: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
add0: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
ade0: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
adf0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
ae00: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ae10: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ae20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ae30: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
ae40: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
ae50: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
ae60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ae70: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
ae80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ae90: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
aea0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
aeb0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
aec0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
aed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
aee0: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
aef0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
af00: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
af10: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
af20: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
af30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
af40: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
af50: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
af60: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
af70: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
af80: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
af90: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
afa0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
afb0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
afc0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
afd0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
afe0: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
aff0: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
b000: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
b010: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
b020: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
b030: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
b040: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
b050: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
b060: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
b070: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
b080: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
b090: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b0a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b0b0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
b0c0: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
b0d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b0e0: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
b0f0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b100: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
b110: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
b120: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b130: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b140: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
b150: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
b160: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b170: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
b180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
b190: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
b1a0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
b1b0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
b1c0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
b1d0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
b1e0: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
b1f0: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
b200: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
b210: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
b220: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
b230: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
b240: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
b250: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
b260: 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65  Base){.  pDerive
b270: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
b280: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
b290: 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76  omJoin;.  pDeriv
b2a0: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
b2b0: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
b2c0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a  ghtJoinTable;.}.
b2d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b2f0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
b300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b310: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
b320: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
b330: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
b340: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
b350: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
b360: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
b370: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
b380: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
b390: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
b3a0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
b3b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
b3d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
b3e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b3f0: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
b400: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
b410: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
b420: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
b430: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
b440: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
b450: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
b460: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
b470: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
b480: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
b490: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
b4a0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
b4b0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
b4c0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
b4d0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
b4e0: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
b4f0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
b500: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
b510: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
b520: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
b530: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
b540: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
b550: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
b560: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
b570: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
b580: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
b590: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
b5a0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
b5b0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
b5c0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
b5d0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
b5e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
b5f0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
b600: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
b610: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
b620: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
b630: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
b640: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
b650: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
b660: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
b670: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
b680: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
b690: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
b6a0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
b6b0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
b6c0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
b6d0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
b6e0: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
b6f0: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
b700: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
b710: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
b720: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
b730: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
b740: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
b750: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
b760: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
b770: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
b780: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
b790: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
b7a0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
b7b0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
b7c0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
b7d0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
b7e0: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
b7f0: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
b800: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
b810: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
b820: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
b830: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
b840: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
b850: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
b860: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
b870: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
b880: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
b890: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
b8a0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
b8b0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
b8c0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
b8d0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
b8e0: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
b8f0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
b900: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
b910: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
b920: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
b930: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
b940: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
b950: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
b960: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
b970: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
b980: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
b990: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b9a0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
b9b0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
b9c0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
b9d0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
b9e0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
b9f0: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
ba00: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
ba10: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
ba20: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
ba30: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
ba40: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
ba50: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
ba60: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
ba70: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
ba80: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
ba90: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
baa0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
bab0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
bac0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
bad0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
bae0: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
baf0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
bb00: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
bb10: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
bb20: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
bb30: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
bb40: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
bb50: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
bb60: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
bb70: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
bb80: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
bb90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
bba0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
bbb0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
bbc0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
bbd0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
bbe0: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
bbf0: 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  hat.** is someth
bc00: 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65  ing the bestInde
bc10: 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  x() routine will
bc20: 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69   determine.  Thi
bc30: 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e  s analysis.** on
bc40: 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74  ly looks at whet
bc50: 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70  her subterms app
bc60: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
bc70: 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a  exing exist..**.
bc80: 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20  ** All examples 
bc90: 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76  A through E abov
bca0: 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61  e all satisfy ca
bcb0: 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20  se 2.  But if a 
bcc0: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61  term.** also sta
bcd0: 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28  tisfies case 1 (
bce0: 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e  such as B) we kn
bcf0: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  ow that the opti
bd00: 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c  mizer will.** al
bd10: 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65  ways prefer case
bd20: 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63   1, so in that c
bd30: 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74  ase we pretend t
bd40: 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f  hat case 2 is no
bd50: 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a  t.** satisfied..
bd60: 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62  **.** It might b
bd70: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
bd80: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
bd90: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20  are indexable.  
bda0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
bdb0: 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64  (E) above is ind
bdc0: 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73  exable on tables
bdd0: 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a   P, Q, and R..**
bde0: 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73  .** Terms that s
bdf0: 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72  atisfy case 2 ar
be00: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
be10: 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67   lookup by using
be20: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64  .** separate ind
be30: 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77  ices to find row
be40: 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62  ids for each sub
be50: 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69  term and composi
be60: 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20  ng.** the union 
be70: 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73  of all rowids us
be80: 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
be90: 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  ect.  This is si
bea0: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74  milar.** to "bit
beb0: 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20  map indices" in 
bec0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65  other database e
bed0: 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54  ngines..**.** OT
bee0: 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49  HERWISE:.**.** I
bef0: 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31  f neither case 1
bf00: 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c   nor case 2 appl
bf10: 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68  y, then leave th
bf20: 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  e eOperator set 
bf30: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69  to.** zero.  Thi
bf40: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73  s term is not us
bf50: 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e  eful for search.
bf60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bf70: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
bf80: 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m(.  SrcList *pS
bf90: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
bfa0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
bfb0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
bfc0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
bfd0: 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   /* the complete
bfe0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
bff0: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c010: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d  Index of the OR-
c020: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
c030: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
c040: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
c050: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20  pWC->pWInfo;    
c060: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
c070: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
c080: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
c090: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
c0a0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
c0b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
c0c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
c0d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c0e0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
c0f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
c100: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  onnection */.  W
c110: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
c120: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
c130: 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  m];    /* The te
c140: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
c150: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  d */.  Expr *pEx
c160: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
c170: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
c180: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c190: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
c1a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c1d0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c1e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
c1f0: 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65  Wc;       /* Bre
c200: 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e  akup of pTerm in
c210: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
c220: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
c230: 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  erm;       /* A 
c240: 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20  Sub-term within 
c250: 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57  the pOrWc */.  W
c260: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49  hereOrInfo *pOrI
c270: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69  nfo;     /* Addi
c280: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
c290: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
c2a0: 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69  th pTerm */.  Bi
c2b0: 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20  tmask chngToIN; 
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c2d0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
c2e0: 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20  isfy case 1 */. 
c2f0: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
c300: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61  le;        /* Ta
c310: 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  bles that are in
c320: 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79  dexable, satisfy
c330: 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20  ing case 2 */.. 
c340: 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74   /*.  ** Break t
c350: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
c360: 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73  o its separate s
c370: 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75  ubterms.  The su
c380: 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20  bterms are.  ** 
c390: 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72  stored in a Wher
c3a0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
c3b0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74  e containing wit
c3c0: 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49  hin the WhereOrI
c3d0: 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  nfo.  ** object 
c3e0: 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64  that is attached
c3f0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
c400: 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e   OR clause term.
c410: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c420: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
c430: 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  & (TERM_DYNAMIC|
c440: 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
c450: 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  _ANDINFO))==0 );
c460: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
c470: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
c480: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
c490: 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71  o = pOrInfo = sq
c4a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c4b0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  o(db, sizeof(*pO
c4c0: 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70  rInfo));.  if( p
c4d0: 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  OrInfo==0 ) retu
c4e0: 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  rn;.  pTerm->wtF
c4f0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49  lags |= TERM_ORI
c500: 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26  NFO;.  pOrWc = &
c510: 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77  pOrInfo->wc;.  w
c520: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
c530: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
c540: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
c550: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
c560: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
c570: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
c580: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
c590: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
c5a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
c5b0: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
c5c0: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
c5d0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
c5e0: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
c5f0: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
c600: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
c610: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
c620: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
c630: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
c640: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
c650: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
c660: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
c670: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
c680: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
c690: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
c6a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
c6b0: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
c6c0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
c6d0: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
c6e0: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
c6f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
c700: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
c710: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
c720: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
c730: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
c740: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c750: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
c760: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
c770: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
c780: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
c790: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
c7a0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
c7b0: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
c7c0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
c7d0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
c7e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
c7f0: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
c800: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
c810: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
c820: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
c830: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
c840: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
c850: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
c860: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
c870: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
c880: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
c890: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
c8a0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
c8b0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
c8c0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
c8d0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
c8e0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
c8f0: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
c900: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
c910: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
c920: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c930: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
c940: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
c950: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
c960: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
c970: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
c980: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
c990: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
c9a0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
c9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
c9c0: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
c9d0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
c9e0: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
c9f0: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
ca00: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
ca10: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
ca20: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
ca30: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
ca40: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ca60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ca70: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
ca80: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
ca90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
caa0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
cab0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
cac0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
cad0: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
cae0: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
caf0: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
cb00: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
cb10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
cb20: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
cb30: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
cb40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
cb50: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
cb60: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
cb70: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
cb80: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
cb90: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
cba0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
cbb0: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
cbc0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
cbd0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
cbe0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
cbf0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
cc00: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
cc10: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
cc20: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
cc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
cc40: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
cc50: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
cc60: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
cc70: 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)==0 ){.       
cc80: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
cc90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cca0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
ccb0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
ccc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
ccd0: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
cce0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
ccf0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
cd00: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
cd10: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
cd20: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
cd30: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
cd40: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
cd50: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
cd60: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
cd70: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
cd80: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
cd90: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
cda0: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
cdb0: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
cdc0: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
cdd0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
cde0: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
cdf0: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
ce00: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
ce10: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
ce20: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
ce30: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
ce40: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
ce50: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
ce60: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
ce70: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
ce80: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
ce90: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
cea0: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
ceb0: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
cec0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
ced0: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
cee0: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
cef0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
cf00: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
cf10: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
cf20: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
cf30: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
cf40: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
cf50: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
cf60: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
cf70: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
cf80: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
cf90: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
cfa0: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
cfb0: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
cfc0: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
cfd0: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
cfe0: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
cff0: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
d000: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
d010: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
d020: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
d030: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
d040: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
d050: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
d060: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
d070: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
d080: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
d090: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
d0a0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
d0b0: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
d0c0: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
d0d0: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
d0e0: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
d0f0: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
d100: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
d110: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d120: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
d130: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
d140: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
d150: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
d160: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
d170: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
d180: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
d190: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
d1a0: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
d1b0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
d1c0: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
d1d0: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
d1e0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
d1f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
d200: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
d210: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
d220: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
d230: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
d240: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
d250: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
d260: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
d270: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
d280: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
d290: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
d2a0: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
d2b0: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
d2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d2d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
d2e0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
d2f0: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
d300: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
d310: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
d320: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
d330: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
d340: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
d350: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
d360: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
d370: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
d380: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
d390: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
d3a0: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
d3b0: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
d3c0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
d3d0: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
d3e0: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
d3f0: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
d400: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
d410: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
d420: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
d430: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
d440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d450: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
d460: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
d470: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
d480: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
d490: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
d4a0: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
d4b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d4c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d4d0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
d4e0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
d4f0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
d500: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
d510: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
d520: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
d530: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
d540: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
d550: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
d560: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
d570: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
d580: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
d590: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
d5a0: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
d5b0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
d5c0: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
d5d0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
d5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
d5f0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
d600: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d610: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
d620: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
d630: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
d640: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
d650: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
d660: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
d670: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
d680: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
d690: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
d6a0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
d6b0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
d6c0: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
d6d0: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
d6e0: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
d6f0: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
d700: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
d710: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
d720: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
d730: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
d740: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
d750: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
d760: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
d770: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
d780: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d790: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
d7a0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d7b0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d7c0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
d7d0: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
d7e0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d7f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
d800: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
d810: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
d820: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d840: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
d850: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
d860: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
d870: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
d880: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
d890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d8a0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
d8b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
d8c0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
d8d0: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
d8e0: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
d8f0: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
d900: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
d910: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
d920: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
d930: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d940: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
d950: 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20  chngToIN) );.   
d960: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
d970: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26  gToIN==getMask(&
d980: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
d990: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
d9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9b0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
d9c0: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
d9d0: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
d9e0: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
d9f0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
da00: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
da10: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
da20: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
da30: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
da40: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
da50: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
da60: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
da70: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
da80: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
da90: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
daa0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
dab0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
dac0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
dad0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
dae0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
daf0: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
db00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
db10: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
db20: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
db30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
db40: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
db50: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
db60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
db70: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
db80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
db90: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
dba0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
dbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
dbc0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
dbd0: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
dbe0: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
dbf0: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
dc00: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
dc10: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
dc20: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
dc30: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
dc40: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
dc50: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
dc60: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
dc70: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
dc80: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
dc90: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
dca0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
dcb0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
dcc0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
dcd0: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
dce0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
dcf0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
dd00: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
dd10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
dd20: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
dd30: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
dd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
dd50: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
dd60: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
dd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
dd80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
dd90: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
dda0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddb0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ddc0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
ddd0: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
dde0: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
ddf0: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
de00: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
de10: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
de20: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
de30: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
de40: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
de50: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
de60: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
de70: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
de80: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
de90: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
dea0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
deb0: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
dec0: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
ded0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
dee0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
def0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
df00: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
df10: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
df20: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
df30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
df40: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
df50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
df60: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
df70: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
df80: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
df90: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
dfa0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
dfb0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
dfc0: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
dfd0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
dfe0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
dff0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
e000: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
e010: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
e020: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
e030: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
e040: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e050: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
e060: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
e070: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e080: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
e090: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
e0a0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
e0b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
e0c0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
e0d0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
e0e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
e0f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
e100: 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d  stAppend(pWInfo-
e110: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
e120: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
e130: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
e140: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
e150: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
e160: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
e170: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
e180: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
e190: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
e1a0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
e1b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
e1c0: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
e1d0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
e1e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e1f0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
e200: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
e210: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
e220: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e230: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e240: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
e250: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
e260: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
e270: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
e280: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
e290: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
e2a0: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
e2b0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
e2c0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
e2d0: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
e2e0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
e2f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
e300: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
e310: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
e320: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
e330: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
e340: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
e350: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
e360: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
e370: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e390: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
e3a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
e3b0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
e3c0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
e3d0: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
e3e0: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
e3f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
e400: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
e410: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e420: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
e430: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
e440: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
e450: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e460: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
e470: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
e480: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
e490: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
e4a0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
e4b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
e4c0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
e4d0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
e4e0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
e4f0: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
e500: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
e510: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
e520: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e530: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
e540: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
e550: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
e560: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
e570: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
e580: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
e590: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
e5a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
e5b0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
e5c0: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
e5d0: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
e5e0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
e5f0: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
e600: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
e610: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
e620: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
e630: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
e640: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
e650: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e660: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
e670: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
e680: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
e690: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
e6a0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
e6b0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
e6c0: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
e6d0: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
e6e0: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
e6f0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
e700: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
e710: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
e720: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
e730: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
e740: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
e750: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
e760: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
e770: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
e780: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
e790: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
e7a0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
e7b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
e7c0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
e7d0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
e7e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
e7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
e800: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
e810: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
e820: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
e830: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e840: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
e850: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
e860: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
e870: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e880: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
e890: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
e8a0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
e8b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
e8c0: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
e8d0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e8e0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
e8f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
e900: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
e910: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
e920: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
e930: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
e940: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
e950: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
e960: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
e970: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e980: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
e990: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
e9a0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
e9b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
e9c0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
e9d0: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
e9e0: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
e9f0: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
ea00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
ea10: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
ea20: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
ea30: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
ea40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
ea50: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
ea60: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
ea70: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
ea80: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ea90: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
eaa0: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
eab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
eac0: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
ead0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
eae0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
eaf0: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
eb00: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
eb10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
eb20: 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42      /* LIKE/GLOB
eb30: 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63   distinguishes c
eb40: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ase */.  int op;
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
eb70: 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e  -level operator.
eb80: 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20    pExpr->op */. 
eb90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
eba0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
ebb0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ebc0: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
ebd0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ebe0: 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  db;        /* Da
ebf0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ec00: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  n */..  if( db->
ec10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ec20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ec30: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ec40: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
ec50: 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
ec60: 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->sMaskSet;.  pE
ec70: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
ec80: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
ec90: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
eca0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
ecb0: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
ecc0: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
ecd0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ece0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
ecf0: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
ed00: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
ed10: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
ed20: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
ed30: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
ed40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ed50: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
ed60: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
ed70: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ed80: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
ed90: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
eda0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
edb0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
edc0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
edd0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
ede0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
edf0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ee00: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
ee10: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
ee20: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
ee30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ee40: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
ee50: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
ee60: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
ee70: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ee80: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
ee90: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
eea0: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
eeb0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
eec0: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
eed0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
eee0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
eef0: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
ef00: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
ef10: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
ef20: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
ef30: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
ef40: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
ef50: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
ef60: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
ef70: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
ef80: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
efb0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
efc0: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
efd0: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
efe0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
eff0: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
f000: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
f010: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
f020: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
f030: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
f040: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
f050: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
f060: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
f070: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
f080: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f090: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
f0a0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
f0b0: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
f0c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
f0d0: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
f0e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
f0f0: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
f100: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
f110: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
f120: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f130: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
f140: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
f150: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
f160: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
f170: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
f180: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
f190: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
f1a0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
f1b0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
f1c0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
f1d0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
f1e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
f1f0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
f200: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
f210: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
f220: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
f230: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
f240: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
f250: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
f260: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
f270: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
f280: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
f290: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
f2a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
f2b0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
f2c0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
f2d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f2f0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
f300: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
f310: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
f320: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
f330: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
f340: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
f350: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
f360: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
f370: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
f380: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
f390: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
f3a0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
f3b0: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
f3c0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
f3d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
f3e0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
f3f0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
f400: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
f410: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
f420: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
f430: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
f440: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
f450: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
f460: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f470: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
f480: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
f490: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
f4a0: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
f4b0: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
f4c0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
f4d0: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
f4e0: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
f4f0: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
f500: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
f510: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f520: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
f530: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
f540: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
f550: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
f560: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
f570: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
f580: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
f590: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
f5a0: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
f5b0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
f5c0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
f5d0: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
f5e0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
f5f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
f600: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
f610: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
f620: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
f630: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
f640: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
f650: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
f660: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
f670: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
f680: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
f690: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
f6a0: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
f6b0: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
f6c0: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
f6d0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
f6e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
f6f0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
f700: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
f710: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
f720: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
f730: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
f740: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
f750: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
f760: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
f770: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
f780: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
f790: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
f7a0: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
f7b0: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
f7c0: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
f7d0: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
f7e0: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
f7f0: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
f800: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
f810: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
f820: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
f830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
f840: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
f850: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
f860: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
f870: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
f880: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
f890: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
f8a0: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
f8b0: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
f8c0: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
f8d0: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
f8e0: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
f8f0: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
f900: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
f910: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
f920: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
f930: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
f940: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
f950: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
f960: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
f970: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
f980: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
f990: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
f9a0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
f9b0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
f9c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f9d0: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
f9e0: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
f9f0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
fa00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
fa10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
fa20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fa30: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
fa40: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
fa50: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
fa60: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
fa70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
fa80: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
fab0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
fac0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
fad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
faf0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
fb00: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
fb10: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
fb20: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
fb30: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
fb40: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
fb50: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
fb60: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
fb70: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
fb80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
fb90: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
fba0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
fbb0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
fbc0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
fbd0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
fbe0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
fbf0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
fc00: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
fc10: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
fc20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
fc30: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
fc40: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
fc50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
fc60: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
fc70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fc80: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
fc90: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
fca0: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
fcb0: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
fcc0: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
fcd0: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
fce0: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
fcf0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
fd00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
fd10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
fd20: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
fd30: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
fd40: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
fd50: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
fd60: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
fd70: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
fd80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fd90: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
fda0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
fdb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
fdc0: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
fdd0: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
fde0: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
fdf0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
fe00: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
fe10: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
fe20: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
fe30: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
fe40: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
fe50: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
fe60: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
fe70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fe80: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
fe90: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
fea0: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
feb0: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
fec0: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
fed0: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
fee0: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
fef0: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ff00: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ff10: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ff20: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ff30: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
ff40: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
ff50: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
ff60: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
ff70: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
ff80: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
ff90: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
ffa0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
ffb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
ffc0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
ffd0: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
ffe0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
fff0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
10000 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
10010 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
10020 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
10030 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
10040 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
10050 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
10060 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
10070 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
10080 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
10090 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
100a0 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
100b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
100c0 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
100d0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
100e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
100f0 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
10100 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
10110 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
10120 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
10130 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
10140 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
10150 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
10160 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
10170 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
10180 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
10190 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
101a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
101b0 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
101c0 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
101d0 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
101e0 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
101f0 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
10200 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
10210 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
10220 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
10230 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
10240 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
10250 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
10260 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
10270 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
10280 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
10290 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
102a0 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
102b0 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
102c0 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
102d0 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
102e0 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
102f0 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
10300 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
10310 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
10320 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
10330 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
10340 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
10350 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
10360 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
10370 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
10380 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
10390 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
103a0 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
103b0 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
103c0 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
103d0 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
103e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
103f0 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
10400 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
10410 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
10420 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
10430 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
10440 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
10450 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
10460 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
10470 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
10480 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
10490 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
104a0 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
104b0 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
104c0 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
104d0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
104e0 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
104f0 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
10500 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
10510 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
10520 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10530 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
10540 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
10550 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10560 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
10570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
10580 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
10590 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c  Parse,pNewExpr2,
105a0 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
105b0 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32             pStr2
105c0 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
105d0 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
105e0 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
105f0 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
10600 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
10610 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10620 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
10630 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
10640 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
10650 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
10660 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
10670 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
10680 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
10690 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
106a0 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
106b0 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
106c0 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
106d0 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
106e0 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
106f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
10700 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10710 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
10720 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
10730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10740 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
10750 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
10760 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
10770 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
10780 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
10790 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
107a0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
107b0 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
107c0 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
107d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
107e0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
107f0 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
10800 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
10810 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
10820 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
10830 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
10840 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
10850 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
10860 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
10870 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
10880 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
10890 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
108a0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
108b0 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
108c0 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
108d0 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
108e0 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
108f0 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
10900 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
10910 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
10920 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
10930 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
10940 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
10950 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
10960 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
10970 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
10980 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
10990 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
109a0 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
109b0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
109c0 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
109d0 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
109e0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
109f0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
10a00 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
10a10 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
10a20 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
10a50 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
10a60 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
10a70 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
10a80 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
10a90 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
10aa0 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
10ab0 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
10ac0 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
10ad0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
10ae0 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
10af0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
10b00 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
10b10 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
10b20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
10b30 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
10b40 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
10b50 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
10b60 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
10b70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
10b80 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
10b90 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
10ba0 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
10bb0 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
10bc0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
10bd0 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
10be0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
10bf0 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
10c00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
10c10 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
10c20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
10c30 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
10c40 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
10c50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
10c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10c70 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
10c80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10c90 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68  LE_STAT4.  /* Wh
10ca0 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  en sqlite_stat3 
10cb0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
10cc0 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f  s available an o
10cd0 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20  perator of the. 
10ce0 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e   ** form "x IS N
10cf0 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d  OT NULL" can som
10d00 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61  etimes be evalua
10d10 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65  ted more efficie
10d20 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e  ntly.  ** as "x>
10d30 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f  NULL" if x is no
10d40 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
10d50 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f  MARY KEY.  So co
10d60 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76  nstruct a.  ** v
10d70 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74  irtual term of t
10d80 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20  hat form..  **. 
10d90 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
10da0 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d  e virtual term m
10db0 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69  ust be tagged wi
10dc0 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20  th TERM_VNULL.  
10dd0 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56  This.  ** TERM_V
10de0 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75  NULL tag will su
10df0 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e  ppress the not-n
10e00 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65  ull check at the
10e10 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
10e20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69  of the loop.  Wi
10e30 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56  thout the TERM_V
10e40 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e  NULL flag, the n
10e50 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
10e60 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20  .  ** the start 
10e70 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  of the loop will
10e80 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73   prevent any res
10e90 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  ults from being 
10ea0 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
10eb0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
10ec0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
10ed0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
10ee0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
10ef0 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10f00 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26  >iColumn>=0.   &
10f10 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
10f20 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
10f30 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20  _Stat3).  ){.   
10f40 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
10f50 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
10f60 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
10f70 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
10f80 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
10f90 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
10fa0 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
10fb0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10fc0 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
10ff0 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11020 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
11030 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
11040 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
11050 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
11060 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
11070 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
110a0 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
110b0 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
110c0 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
110d0 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
110e0 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
110f0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11100 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
11110 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
11120 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
11130 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
11140 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
11150 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
11160 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
11170 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
11180 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
11190 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
111a0 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
111b0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
111c0 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
111d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
111e0 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
111f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
11200 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
11210 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11220 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
11230 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
11240 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
11250 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
11260 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  STAT */..  /* Pr
11270 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
11280 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
11290 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
112a0 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
112b0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
112c0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
112d0 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
112e0 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
112f0 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
11300 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
11310 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11320 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
11330 6f 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20  or a entry that 
11340 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
11350 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
11360 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
11370 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
11380 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
11390 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
113a0 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
113b0 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
113c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
113d0 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
113e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
113f0 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
11400 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11420 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
11430 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
11440 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
11450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
11460 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
11470 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
11480 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
11490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
114a0 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
114b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
114c0 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
114d0 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
114f0 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
11500 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
11510 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
11520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11530 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
11540 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
11550 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
11560 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
11570 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
11580 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
11590 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
115a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
115b0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
115c0 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
115d0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
115e0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
115f0 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
11600 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
11610 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
11620 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
11630 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
11640 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11650 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
11660 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11670 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
11690 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
116a0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
116b0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
116c0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
116d0 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
116e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
116f0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
11700 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
11710 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
11720 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
11730 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
11740 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
11750 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a  s redundant..**.
11760 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  ** A DISTINCT li
11770 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
11780 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
11790 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75  contains some su
117a0 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  bset of.** colum
117b0 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71  ns that are uniq
117c0 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e  ue and non-null.
117d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
117e0 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
117f0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
11800 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11810 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11820 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
11830 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
11840 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
11850 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
11860 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
11870 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11880 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
11890 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
118a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
118b0 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
118c0 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
118d0 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
118e0 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
118f0 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
11920 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
11930 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
11940 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
11950 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
11960 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
11970 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
11980 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
11990 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
119a0 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
119b0 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
119c0 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
119d0 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
119e0 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
119f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
11a00 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
11a10 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
11a20 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
11a30 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
11a40 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
11a50 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
11a60 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
11a70 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
11a80 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
11a90 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
11aa0 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
11ab0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
11ac0 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
11ad0 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
11ae0 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
11af0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
11b00 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
11b10 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
11b20 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11b30 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
11b40 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11b50 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
11b60 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
11b70 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
11b80 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
11b90 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
11ba0 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
11bb0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
11bc0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
11bd0 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
11be0 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
11bf0 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
11c00 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
11c10 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
11c20 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
11c30 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
11c40 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
11c50 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
11c60 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
11c70 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
11c80 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
11c90 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
11ca0 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
11cb0 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
11cc0 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
11cd0 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
11ce0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
11cf0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
11d00 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
11d10 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
11d20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
11d30 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
11d40 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
11d50 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
11d60 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
11d70 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
11d80 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
11d90 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
11da0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
11db0 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
11dc0 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
11dd0 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
11de0 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
11df0 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
11e00 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
11e10 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
11e20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
11e30 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
11e40 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11e50 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11e60 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11e70 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
11e80 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
11e90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
11ea0 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
11eb0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
11ec0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
11ed0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
11ee0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
11ef0 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
11f00 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
11f10 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
11f20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
11f30 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
11f40 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
11f50 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
11f60 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
11f70 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
11f80 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
11f90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
11fa0 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  ]].notNull==0 ){
11fb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11fe0 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( i==pIdx->nColu
11ff0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mn ){.      /* T
12000 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
12010 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
12020 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
12030 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
12040 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12050 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
12060 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  rn 0;.}../* .** 
12070 54 68 65 20 28 61 6e 20 61 70 70 72 6f 78 69 6d  The (an approxim
12080 61 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20  ate) sum of two 
12090 57 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69  WhereCosts.  Thi
120a0 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  s computation is
120b0 0a 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65  .** not a simple
120c0 20 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65   "+" operator be
120d0 63 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20  cause WhereCost 
120e0 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
120f0 6f 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61  ogarithmic.** va
12100 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  lue..** .*/.stat
12110 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
12120 72 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43  reCostAdd(WhereC
12130 6f 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74  ost a, WhereCost
12140 20 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f   b){.  static co
12150 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12160 72 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31  r x[] = {.     1
12170 30 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20  0, 10,          
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12190 2a 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39  * 0,1 */.      9
121a0 2c 20 39 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 9,            
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121c0 20 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c   2,3 */.      8,
121d0 20 38 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   8,             
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121f0 34 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20  4,5 */.      7, 
12200 37 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20  7, 7,           
12210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36              /* 6
12220 2c 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c  ,7,8 */.      6,
12230 20 36 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20   6, 6,          
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12250 39 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20  9,10,11 */.     
12260 20 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20   5, 5, 5,       
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 2f 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20  /* 12-14 */.    
12290 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20    4, 4, 4, 4,   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20   /* 15-18 */.   
122c0 20 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33     3, 3, 3, 3, 3
122d0 2c 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 3,            
122e0 20 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20    /* 19-24 */.  
122f0 20 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20      2, 2, 2, 2, 
12300 32 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20  2, 2, 2,        
12310 20 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20     /* 25-31 */. 
12320 20 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29   };.  if( a>=b )
12330 7b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39  {.    if( a>b+49
12340 20 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20   ) return a;.   
12350 20 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65   if( a>b+31 ) re
12360 74 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65  turn a+1;.    re
12370 74 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20  turn a+x[a-b];. 
12380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
12390 62 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20  b>a+49 ) return 
123a0 62 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33  b;.    if( b>a+3
123b0 31 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a  1 ) return b+1;.
123c0 20 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62      return b+x[b
123d0 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  -a];.  }.}../*.*
123e0 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74  * Convert an int
123f0 65 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72  eger into a Wher
12400 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
12410 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
12420 61 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78  a.** good approx
12430 69 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30  imatation for 10
12440 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61  *log2(x)..*/.sta
12450 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68  tic WhereCost wh
12460 65 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20  ereCost(tRowcnt 
12470 78 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65  x){.  static Whe
12480 72 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30  reCost a[] = { 0
12490 2c 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c  , 2, 3, 5, 6, 7,
124a0 20 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65   8, 9 };.  Where
124b0 43 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69  Cost y = 40;.  i
124c0 66 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66  f( x<8 ){.    if
124d0 28 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30  ( x<2 ) return 0
124e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38  ;.    while( x<8
124f0 20 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20   ){  y -= 10; x 
12500 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65  <<= 1; }.  }else
12510 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32  {.    while( x>2
12520 35 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78  55 ){ y += 40; x
12530 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68   >>= 4; }.    wh
12540 69 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20  ile( x>15 ){  y 
12550 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20  += 10; x >>= 1; 
12560 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
12570 5b 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a  [x&7] + y - 10;.
12580 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12590 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
125a0 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  BLE./*.** Conver
125b0 74 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72  t a double (as r
125c0 65 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65  eceived from xBe
125d0 73 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72  stIndex of a vir
125e0 74 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69  tual table).** i
125f0 6e 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e  nto a WhereCost.
12600 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12610 2c 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70  , compute an app
12620 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a  roximation for.*
12630 2a 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  * 10*log2(x)..*/
12640 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
12650 74 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  t whereCostFromD
12660 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b  ouble(double x){
12670 0a 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72  .  u64 a;.  Wher
12680 65 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72  eCost e;.  asser
12690 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
126a0 26 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20  && sizeof(a)==8 
126b0 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20  );.  if( x<=1 ) 
126c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
126d0 78 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20  x<=2000000000 ) 
126e0 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74  return whereCost
126f0 28 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20  ((tRowcnt)x);.  
12700 6d 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38  memcpy(&a, &x, 8
12710 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29  );.  e = (a>>52)
12720 20 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72   - 1022;.  retur
12730 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66  n e*10;.}.#endif
12740 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12750 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
12760 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
12770 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
12780 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
12790 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
127a0 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
127b0 65 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74  estLog(WhereCost
127c0 20 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74   N){.  WhereCost
127d0 20 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e   x = whereCost(N
127e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33  );.  return x>33
127f0 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d   ? x - 33 : 0;.}
12800 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
12810 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
12820 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
12830 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
12840 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
12850 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
12860 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
12870 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
12880 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
12890 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
128a0 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
128b0 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
128c0 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
128d0 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
128e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
128f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
12900 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
12910 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
12920 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
12930 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
12940 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
12950 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12960 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
12970 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
12980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12990 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
129a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
129b0 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
129c0 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
129d0 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
129e0 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
129f0 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
12a00 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12a10 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
12a20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12a30 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
12a40 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
12a50 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
12a60 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12a70 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
12a80 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
12a90 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
12aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12ab0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12ac0 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
12ad0 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
12ae0 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12af0 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
12b00 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
12b10 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12b20 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
12b30 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
12b40 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
12b50 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
12b60 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12b70 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
12b80 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
12b90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12ba0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12bc0 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
12bd0 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
12be0 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
12bf0 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
12c00 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12c10 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
12c20 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12c30 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
12c40 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
12c50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12c60 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
12c70 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
12c80 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12c90 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
12ca0 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
12cb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12cc0 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
12cd0 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
12ce0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
12cf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12d00 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
12d10 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
12d20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
12d30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
12d40 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
12d50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
12d60 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
12d70 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
12d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12d90 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
12da0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12db0 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
12dc0 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
12dd0 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
12de0 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
12df0 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
12e00 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
12e10 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
12e20 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
12e30 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
12e40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
12e50 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
12e60 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12e70 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
12e80 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
12e90 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
12ea0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12eb0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12ec0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
12ed0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
12ee0 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
12ef0 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
12f00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12f10 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
12f20 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
12f30 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
12f40 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
12f50 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
12f60 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
12f70 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
12f80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
12f90 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
12fa0 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
12fb0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
12fc0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
12fd0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
12fe0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
12ff0 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
13000 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
13010 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
13020 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
13030 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
13040 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
13050 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
13060 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
13070 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
13080 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
13090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
130a0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
130b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
130c0 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
130d0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
130e0 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
130f0 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
13100 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
13110 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
13120 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
13130 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
13140 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
13150 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
13160 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
13170 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
13180 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
13190 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131b0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
131c0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
131d0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
131e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
131f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
13200 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13210 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
13220 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
13230 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
13240 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
13250 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
13260 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
13270 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
13280 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
13290 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
132a0 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
132b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
132c0 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
132d0 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
13300 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
13310 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
13320 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13330 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
13340 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
13350 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
13360 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
13370 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
13380 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
13390 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
133a0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
133b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
133c0 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
133d0 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
133e0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
133f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13400 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
13410 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
13420 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
13430 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
13440 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
13450 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
13460 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
13470 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
13480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13490 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
134a0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
134b0 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
134c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134e0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
134f0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
13500 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
13510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
13520 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
13530 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
13540 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13560 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
13570 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
13580 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135a0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
135b0 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
135c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
135f0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13620 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
13630 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
13640 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
13650 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
13660 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
13670 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
13680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13690 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
136a0 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
136b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
136c0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
136d0 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
136e0 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
136f0 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
13700 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
13710 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
13720 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
13730 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
13740 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
13750 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
13760 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
13770 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67    u8 sentWarning
13780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
13790 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e   True if a warnn
137a0 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73  ing has been iss
137b0 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ued */..  /* Gen
137c0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
137d0 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
137e0 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
137f0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
13800 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
13810 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
13820 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
13830 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
13840 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
13850 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
13860 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
13870 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
13880 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
13890 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
138a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
138b0 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
138c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
138d0 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
138e0 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
138f0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
13900 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e  nts */.  nColumn
13910 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
13920 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
13930 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
13940 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
13950 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
13960 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
13970 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
13980 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
13990 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
139a0 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
139b0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
139c0 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
139d0 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
139e0 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
139f0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
13a00 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
13a10 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
13a20 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
13a30 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
13a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
13a50 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
13a60 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
13a70 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
13a80 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
13a90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13aa0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
13ab0 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
13ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
13ad0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
13ae0 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
13af0 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
13b00 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
13b10 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
13b20 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
13b30 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
13b40 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
13b50 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
13b60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13b70 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
13b80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
13b90 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20  p, nColumn+1) ) 
13ba0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
13bb0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43  pLoop->aLTerm[nC
13bc0 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d  olumn++] = pTerm
13bd0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
13be0 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
13bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13c00 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
13c10 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
13c20 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
13c30 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c  p->nLTerm = nCol
13c40 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  umn;.  pLoop->ws
13c50 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
13c60 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
13c70 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
13c80 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
13ca0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
13cb0 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
13cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
13cd0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
13ce0 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
13cf0 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
13d00 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
13d10 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
13d20 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
13d30 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
13d40 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
13d50 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
13d60 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
13d70 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
13d80 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
13d90 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
13da0 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
13db0 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
13dc0 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
13dd0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
13de0 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
13df0 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
13e00 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
13e10 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
13e20 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
13e30 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
13e40 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
13e50 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
13e60 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
13e70 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
13e80 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
13e90 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
13ea0 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
13eb0 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
13ec0 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
13ed0 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
13ee0 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
13ef0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
13f00 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
13f10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
13f20 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
13f30 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
13f40 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
13f50 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
13f60 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
13f70 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  ) ) nColumn++;. 
13f80 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
13f90 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
13fa0 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
13fb0 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
13fc0 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
13fd0 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
13fe0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13ff0 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
14000 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
14010 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
14020 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
14030 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
14040 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d  dex */.  nByte =
14050 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a   sizeof(Index);.
14060 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
14070 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20  mn*sizeof(int); 
14080 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
14090 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65  olumn */.  nByte
140a0 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
140b0 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20  of(char*);   /* 
140c0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a  Index.azColl */.
140d0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
140e0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
140f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
14100 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64  rtOrder */.  pId
14110 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
14120 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
14130 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
14140 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
14150 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  rn;.  pLoop->u.b
14160 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
14170 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  dx;.  pIdx->azCo
14180 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49  ll = (char**)&pI
14190 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  dx[1];.  pIdx->a
141a0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
141b0 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43  &pIdx->azColl[nC
141c0 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
141d0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
141e0 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  *)&pIdx->aiColum
141f0 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49  n[nColumn];.  pI
14200 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
14210 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
14220 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
14230 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  umn;.  pIdx->pTa
14240 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
14250 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
14260 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
14270 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
14280 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
14290 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
142a0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
142b0 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
142c0 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
142d0 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
142e0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
142f0 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
14300 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
14310 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
14320 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
14330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
14340 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
14350 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
14360 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
14370 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
14380 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
14390 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
143a0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
143b0 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
143c0 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
143d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
143e0 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
143f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
14400 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
14410 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14420 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
14430 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
14440 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
14450 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c  ->azColl[n] = AL
14460 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43  WAYS(pColl) ? pC
14470 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
14480 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
14490 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
144a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
144b0 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
144c0 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
144d0 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
144e0 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
144f0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
14500 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
14510 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
14520 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
14530 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
14540 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
14550 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
14560 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
14570 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14580 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
14590 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
145a0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
145b0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
145c0 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
145d0 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
145e0 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
145f0 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
14600 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
14610 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
14620 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
14630 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
14640 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
14650 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
14660 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
14670 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20  Column );..  /* 
14680 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
14690 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
146a0 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyinfo = sqlit
146b0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
146c0 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
146d0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
146e0 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
146f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
14700 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14710 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14720 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
14730 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
14740 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c  l->iIdxCur, nCol
14750 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20  umn+1, 0,.      
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
14770 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50  har*)pKeyinfo, P
14780 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
14790 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  F);.  VdbeCommen
147a0 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
147b0 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
147c0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
147d0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
147e0 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
147f0 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
14800 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14810 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
14820 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
14830 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
14840 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14850 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
14860 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
14870 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
14880 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
14890 72 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  regRecord, 1, 0)
148a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
148b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
148c0 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
148d0 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
148e0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
148f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
14900 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
14910 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
14920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14930 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
14940 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
14950 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
14960 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
14970 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
14980 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
14990 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
149a0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
149b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
149c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
149d0 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
149e0 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
149f0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
14a00 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
14a10 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14a20 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
14a30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14a40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
14a50 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
14a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14a70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
14a80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
14a90 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
14aa0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14ab0 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
14ac0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
14ad0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14ae0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14af0 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
14b00 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
14b10 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
14b20 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
14b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
14b40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14b50 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
14b60 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
14b70 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
14b80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14b90 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
14ba0 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
14bb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14bc0 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
14bd0 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
14be0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
14bf0 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
14c00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14c10 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
14c20 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
14c30 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14c40 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
14c50 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14c60 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14c70 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
14c80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14c90 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
14ca0 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
14cb0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
14cc0 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
14cd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
14ce0 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
14cf0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
14d00 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
14d10 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
14d20 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14d30 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
14d40 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
14d50 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
14d60 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
14d70 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
14d80 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
14d90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
14da0 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
14db0 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
14dc0 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
14dd0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
14de0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
14df0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
14e00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14e10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14e20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
14e30 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
14e40 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
14e50 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
14e60 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
14e70 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
14e80 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
14e90 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
14ea0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
14eb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
14ec0 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
14ed0 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
14ee0 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
14ef0 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
14f00 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
14f10 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
14f20 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
14f30 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14f40 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
14f50 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
14f60 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14f70 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
14f80 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
14f90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
14fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
14fb0 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
14fc0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
14fd0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
14fe0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
14ff0 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
15000 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
15010 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
15020 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
15030 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
15040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15050 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
15060 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15070 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
15080 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
15090 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
150a0 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
150b0 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
150e0 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
150f0 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
15100 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
15130 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
15140 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
15150 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
15160 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15170 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
15180 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
15190 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
151a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
151b0 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
151c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
151d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
151e0 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
151f0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
15200 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
15210 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
15220 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
15230 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
15240 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
15250 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
15260 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
15270 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
15280 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
15290 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
152a0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
152b0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
152c0 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
152d0 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
152e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
152f0 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
15300 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
15310 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
15320 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15330 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
15340 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
15350 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
15360 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15370 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
15380 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
15390 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
153a0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
153b0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
153c0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
153d0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
153e0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
153f0 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
15400 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
15410 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
15420 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
15430 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
15440 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15450 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
15460 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
15470 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
15480 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
154d0 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
154e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
154f0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
15500 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
15510 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
15520 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
15530 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
15540 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15550 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
15560 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
15570 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
15580 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
15590 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
155a0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
155b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
155c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
155d0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
155e0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
155f0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
15600 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
15610 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
15620 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
15630 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
15640 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
15650 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
15660 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
15670 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15680 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
15690 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
156a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
156b0 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
156c0 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
156d0 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
156e0 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
156f0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
15700 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
15710 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
15720 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
15730 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
15740 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
15750 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15760 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
15770 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
15780 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
15790 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
157a0 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
157b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
157c0 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
157d0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
157e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
157f0 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
15800 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
15810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15820 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
15830 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
15840 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15850 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
15860 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15870 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
15880 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
15890 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
158a0 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
158b0 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
158c0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
158d0 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
158e0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
158f0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
15900 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
15910 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
15920 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
15930 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
15940 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
15950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
15960 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15970 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15980 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
15990 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
159a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
159b0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
159c0 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
159d0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
159e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
159f0 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
15a00 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
15a10 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
15a20 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15a30 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15a40 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
15a50 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
15a60 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
15a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
15a80 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
15a90 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
15aa0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
15ab0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
15ac0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15ad0 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
15ae0 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
15af0 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
15b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
15b10 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
15b20 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
15b30 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
15b40 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
15b50 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
15b60 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
15b70 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15b80 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
15b90 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
15ba0 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
15bb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15bc0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
15bd0 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
15be0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
15bf0 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
15c00 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
15c10 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15c20 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
15c30 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
15c40 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
15c50 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
15c60 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
15c70 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
15c80 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
15c90 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
15ca0 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
15cb0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15cc0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
15cd0 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
15ce0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
15cf0 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
15d00 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
15d10 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
15d20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
15d30 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
15d40 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
15d50 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
15d60 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
15d70 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
15d80 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
15d90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
15db0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15dc0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
15dd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15de0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
15df0 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
15e00 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
15e10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15e20 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
15e30 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
15e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15e60 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
15e70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
15e80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
15e90 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
15ea0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
15eb0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
15ec0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
15ed0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
15ee0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
15ef0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
15f00 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
15f10 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
15f20 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15f40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
15f50 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
15f60 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
15f70 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
15f80 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
15f90 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
15fa0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
15fb0 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
15fc0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
15fd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15fe0 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66  LTABLE) */...#if
15ff0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16000 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT4./*.** Es
16010 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
16020 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
16030 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
16040 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
16050 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
16060 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
16070 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
16080 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
16090 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
160a0 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
160b0 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61  han pVal.**    a
160c0 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
160d0 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
160e0 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a   equal to pVal.*
160f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
16100 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
16110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16120 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
16130 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
16160 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
16170 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
16180 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
16190 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
161a0 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
161b0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
161c0 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
161d0 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
161e0 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
161f0 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
16200 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
16210 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
16220 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
16230 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
16240 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
16250 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
16260 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
16270 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
16280 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
16290 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
162a0 69 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20  i;.  int isEq = 
162b0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
162c0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
162d0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  i++){.    int re
162e0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
162f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
16300 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
16310 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  le[i].p, pRec);.
16320 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
16330 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20 28  {.      isEq = (
16340 72 65 73 3d 3d 30 29 3b 0a 20 20 20 20 20 20 62  res==0);.      b
16350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16360 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
16370 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
16380 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
16390 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
163a0 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
163b0 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
163c0 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
163d0 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
163e0 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
163f0 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
16400 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
16410 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73  ]==pVal, then is
16420 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  Eq==1..  */.  if
16430 28 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73  ( isEq ){.    as
16440 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
16450 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74  ample );.    aSt
16460 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
16470 69 5d 2e 61 6e 4c 74 5b 30 5d 3b 0a 20 20 20 20  i].anLt[0];.    
16480 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
16490 6c 65 5b 69 5d 2e 61 6e 45 71 5b 30 5d 3b 0a 20  le[i].anEq[0];. 
164a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
164b0 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
164c0 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
164d0 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
164e0 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
164f0 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
16500 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 30 5d 3b 0a 20  le[0].anLt[0];. 
16510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16520 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
16530 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 70 49 64 78  ->nSample ? pIdx
16540 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20  ->aiRowEst[0] : 
16550 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
16560 30 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  0];.      iLower
16570 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16580 61 6e 45 71 5b 30 5d 20 2b 20 61 53 61 6d 70 6c  anEq[0] + aSampl
16590 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 30 5d 3b 0a  e[i-1].anLt[0];.
165a0 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
165b0 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71  1] = pIdx->avgEq
165c0 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
165d0 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
165e0 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
165f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
16600 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
16610 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
16620 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
16630 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
16640 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
16650 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
16660 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
16670 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
16680 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20  er + iGap;.  }. 
16690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
166a0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
166b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
166c0 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
166d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
166e0 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
166f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16700 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
16710 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
16720 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
16730 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
16740 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
16750 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
16760 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
16770 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
16780 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
16790 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
167a0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
167b0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
167c0 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
167d0 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
167e0 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
167f0 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
16800 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
16810 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
16820 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
16830 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
16840 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
16850 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
16860 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
16870 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
168a0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
168b0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
168c0 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
168d0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
168e0 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
168f0 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
16900 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
16910 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
16920 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
16930 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
16940 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
16950 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
16960 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
16970 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
16980 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
16990 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
169a0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
169b0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
169c0 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
169d0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
169e0 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
169f0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
16a00 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
16a10 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
16a20 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
16a30 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
16a40 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
16a50 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
16a60 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
16a70 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
16a80 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
16a90 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
16aa0 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
16ab0 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
16ac0 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
16ad0 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
16ae0 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
16af0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
16b00 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
16b10 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
16b20 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
16b30 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
16b40 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
16b50 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
16b60 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
16b70 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
16b80 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
16b90 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f  teger divisor to
16ba0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
16bb0 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20  mated.** search 
16bc0 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e  space.  A return
16bd0 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e   value of 1 mean
16be0 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e  s that range con
16bf0 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
16c00 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20  no help at all. 
16c10 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
16c20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65  of 2 means range
16c30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
16c40 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
16c50 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
16c60 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e  h space by half.
16c70 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e    And so forth..
16c80 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
16c90 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
16ca0 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64  _stat3 ANALYZE d
16cb0 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
16cc0 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
16cd0 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
16ce0 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
16cf0 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20  or of 4.  Hence 
16d00 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  a single constra
16d10 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73  int (x>?).** res
16d20 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e  ults in a return
16d30 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67   of 4 and a rang
16d40 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
16d50 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
16d60 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
16d70 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  n of 16..*/.stat
16d80 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
16d90 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
16da0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16db0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
16dc0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
16dd0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
16de0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
16df0 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
16e00 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
16e10 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
16e20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
16e30 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
16e40 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
16e50 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
16e60 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
16e70 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
16e80 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
16e90 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
16ea0 43 6f 73 74 20 2a 70 52 61 6e 67 65 44 69 76 20  Cost *pRangeDiv 
16eb0 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73  /* OUT: Reduce s
16ec0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 74  earch space by t
16ed0 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29  his divisor */.)
16ee0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16ef0 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
16f00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16f10 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
16f20 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
16f30 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
16f40 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
16f50 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
16f60 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
16f70 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
16f80 6e 52 65 63 56 61 6c 69 64 20 0a 20 20 20 26 26  nRecValid .   &&
16f90 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20   p->nSample .   
16fa0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
16fb0 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
16fc0 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
16fd0 20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63   .  ){.    Unpac
16fe0 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
16ff0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
17000 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
17010 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
17020 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
17030 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
17040 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
17050 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
17060 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
17070 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
17080 66 69 6e 69 74 79 3b 0a 20 20 20 20 69 66 28 20  finity;.    if( 
17090 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
170a0 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
170b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
170c0 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
170d0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
170e0 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  Expr */.      Ex
170f0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
17100 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
17110 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
17120 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
17130 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
17140 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
17150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
17160 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
17170 70 50 61 72 73 65 2c 20 70 52 65 63 2c 20 70 45  pParse, pRec, pE
17180 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
17190 62 4f 6b 29 3b 0a 20 20 20 20 20 20 70 52 65 63  bOk);.      pRec
171a0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 71 2b 31  ->nField = nEq+1
171b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
171c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
171d0 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
171e0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
171f0 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3d   p, pRec, 0, a)=
17200 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
17210 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
17220 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
17230 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e     if( (pLower->
17240 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
17250 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b  T)!=0 ) iLower +
17260 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
17270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17290 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
172a0 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
172b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
172c0 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
172d0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
172e0 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  xpr */.      Exp
172f0 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
17300 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
17310 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17320 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
17330 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
17340 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
17350 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
17360 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
17370 50 61 72 73 65 2c 20 70 52 65 63 2c 20 70 45 78  Parse, pRec, pEx
17380 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
17390 4f 6b 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  Ok);.      pRec-
173a0 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 71 2b 31 3b  >nField = nEq+1;
173b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
173c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 0a  QLITE_OK && bOk.
173d0 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
173e0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
173f0 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3d 3d  p, pRec, 1, a)==
17400 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
17410 29 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ){.        iUppe
17420 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
17430 20 20 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65    if( (pUpper->e
17440 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
17450 29 21 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d  )!=0 ) iUpper +=
17460 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
17470 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17490 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 69 42      WhereCost iB
174a0 61 73 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28  ase = whereCost(
174b0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  p->aiRowEst[0]);
174c0 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
174d0 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  r>iLower ){.    
174e0 20 20 20 20 69 42 61 73 65 20 2d 3d 20 77 68 65      iBase -= whe
174f0 72 65 43 6f 73 74 28 69 55 70 70 65 72 20 2d 20  reCost(iUpper - 
17500 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
17510 0a 20 20 20 20 20 20 69 66 28 20 70 42 75 69 6c  .      if( pBuil
17520 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 20  der->nMaxRowcnt 
17530 26 26 20 69 42 61 73 65 3c 70 42 75 69 6c 64 65  && iBase<pBuilde
17540 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 20 29 7b  r->nMaxRowcnt ){
17550 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
17560 44 69 76 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Div = pBuilder->
17570 6e 4d 61 78 52 6f 77 63 6e 74 3b 0a 20 20 20 20  nMaxRowcnt;.    
17580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17590 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42   *pRangeDiv = iB
175a0 61 73 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ase;.      }.   
175b0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
175c0 31 30 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61  100, ("range sca
175d0 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
175e0 75 20 20 64 69 76 3d 25 64 5c 6e 22 2c 0a 20 20  u  div=%d\n",.  
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
17610 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
17620 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 0a 20   *pRangeDiv));. 
17630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17640 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
17650 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
17660 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
17670 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
17680 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
17690 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
176a0 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
176b0 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44  er );.  *pRangeD
176c0 69 76 20 3d 20 30 3b 0a 20 20 2f 2a 20 54 55 4e  iv = 0;.  /* TUN
176d0 49 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75  ING:  Each inequ
176e0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
176f0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
17700 72 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64  rch space 4-fold
17710 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e  ..  ** A BETWEEN
17720 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65   operator, there
17730 66 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74 68  fore, reduces th
17740 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 31  e search space 1
17750 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20  6-fold */.  if( 
17760 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
17770 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
17780 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
17790 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
177a0 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
177b0 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
177c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70  ;.  }.  if( pUpp
177d0 65 72 20 29 7b 0a 20 20 20 20 2a 70 52 61 6e 67  er ){.    *pRang
177e0 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61 73 73  eDiv += 20;  ass
177f0 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65 43 6f  ert( 20==whereCo
17800 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20 20 72  st(4) );.  }.  r
17810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
17820 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17830 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT4./*.** Es
17840 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
17850 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
17860 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
17870 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
17880 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17890 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
178a0 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
178b0 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
178c0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
178d0 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
178e0 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
178f0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
17900 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
17910 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
17920 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
17930 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
17940 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
17950 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
17960 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
17970 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
17980 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
17990 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
179a0 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
179b0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
179c0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
179d0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
179e0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
179f0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17a00 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
17a10 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
17a20 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
17a30 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
17a40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17a50 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
17a60 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
17a70 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
17a80 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
17a90 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
17aa0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
17ab0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17ac0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
17ad0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
17ae0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
17af0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
17b00 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
17b10 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
17b20 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
17b30 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
17b40 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
17b50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17b60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
17b70 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17b80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
17b90 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
17ba0 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
17bb0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
17bc0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
17bd0 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
17be0 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
17bf0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
17c00 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
17c10 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
17c20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
17c30 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
17c40 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
17c50 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17c60 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
17c70 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17c80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
17c90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17ca0 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
17cb0 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b  >pRec;.  u8 aff;
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
17ce0 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
17cf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17d00 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
17d10 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
17d20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
17d30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
17d40 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
17d50 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
17d60 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
17d70 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 28    assert( nEq<=(
17d80 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 3b  p->nColumn+1) );
17d90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
17da0 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
17db0 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
17dc0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
17dd0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
17de0 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lid<nEq );..  /*
17df0 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e   If values are n
17e00 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
17e10 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
17e20 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  he index to the 
17e30 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69  left.  ** of thi
17e40 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61  s one, no estima
17e50 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20  te can be made. 
17e60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
17e70 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28  TFOUND. */.  if(
17e80 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
17e90 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a  alid<(nEq-1) ){.
17ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17eb0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a  E_NOTFOUND;.  }.
17ec0 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 43  .  if( nEq>p->nC
17ed0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
17ee0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
17ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17f00 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
17f10 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17f20 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17f30 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nity;.  rc = sql
17f40 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
17f50 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
17f60 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
17f70 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
17f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17f90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17fa0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
17fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
17fc0 46 4f 55 4e 44 3b 0a 0a 20 20 70 42 75 69 6c 64  FOUND;..  pBuild
17fd0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
17fe0 6e 45 71 3b 0a 20 20 70 52 65 63 2d 3e 6e 46 69  nEq;.  pRec->nFi
17ff0 65 6c 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 72 63  eld = nEq;..  rc
18000 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
18010 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
18020 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72  , 0, a);.  if( r
18030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18040 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
18050 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20  x100,("equality 
18060 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64  scan regions: %d
18070 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  \n", (int)a[1]))
18080 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ;.    *pnRow = a
18090 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 75  [1];.    if( pBu
180a0 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e  ilder->nMaxRowcn
180b0 74 20 26 26 20 2a 70 6e 52 6f 77 3e 70 42 75 69  t && *pnRow>pBui
180c0 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74  lder->nMaxRowcnt
180d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f 77   ){.      *pnRow
180e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d 61   = pBuilder->nMa
180f0 78 52 6f 77 63 6e 74 3b 0a 20 20 20 20 7d 0a 20  xRowcnt;.    }. 
18100 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
18110 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
18120 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18130 4c 45 5f 53 54 41 54 34 29 20 2a 2f 0a 0a 23 69  LE_STAT4) */..#i
18140 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18150 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  LE_STAT4./*.** E
18160 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
18170 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
18180 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
18190 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
181a0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
181b0 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
181c0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
181d0 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
181e0 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
181f0 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
18200 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
18210 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
18220 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
18230 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
18240 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
18250 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18260 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
18270 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
18280 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
18290 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
182a0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
182b0 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
182c0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
182d0 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
182e0 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
182f0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
18300 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
18310 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
18320 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
18330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
18340 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
18350 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
18360 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
18370 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
18380 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
18390 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
183a0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
183b0 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
183c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
183d0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
183e0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
183f0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
18400 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
18410 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
18420 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
18430 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
18440 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
18450 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
18460 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
18470 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
18480 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18490 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
184a0 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
184b0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
184c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
184d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
184e0 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
184f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
18500 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
18510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18520 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
18530 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
18540 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
18550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18560 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
18570 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
18580 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
18590 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
185a0 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
185b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
185c0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
185f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
18600 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
18610 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
18620 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
18630 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18640 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52     nEst = p->aiR
18650 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63  owEst[0];.    rc
18660 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
18670 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
18680 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
18690 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
186a0 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
186b0 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
186c0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
186d0 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
186e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
186f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
18700 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52  nRowEst > p->aiR
18710 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45  owEst[0] ) nRowE
18720 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  st = p->aiRowEst
18730 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 75  [0];.    if( pBu
18740 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e  ilder->nMaxRowcn
18750 74 20 26 26 20 6e 52 6f 77 45 73 74 3e 70 42 75  t && nRowEst>pBu
18760 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e  ilder->nMaxRowcn
18770 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f  t ){.      *pnRo
18780 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d  w = pBuilder->nM
18790 61 78 52 6f 77 63 6e 74 3b 0a 20 20 20 20 7d 65  axRowcnt;.    }e
187a0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f  lse{.      *pnRo
187b0 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
187c0 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43   }.    WHERETRAC
187d0 45 28 30 78 31 30 30 2c 28 22 49 4e 20 72 6f 77  E(0x100,("IN row
187e0 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
187f0 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  g\n", nRowEst));
18800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18810 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
18820 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
18830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18840 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
18850 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
18860 53 54 41 54 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  STAT4) */../*.**
18870 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
18880 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
18890 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
188a0 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
188b0 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
188c0 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
188d0 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
188e0 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
188f0 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
18900 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
18910 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
18920 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
18930 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
18940 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
18950 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
18960 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
18970 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
18980 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
18990 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
189a0 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
189b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
189c0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
189d0 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
189e0 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
189f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
18a00 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
18a10 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
18a20 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
18a30 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
18a40 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
18a50 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
18a60 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
18a70 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
18a80 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
18a90 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
18aa0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
18ab0 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
18ac0 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
18ad0 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
18ae0 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
18af0 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
18b00 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
18b10 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
18b20 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
18b30 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
18b40 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
18b50 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18b60 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
18b70 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
18b80 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
18b90 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
18ba0 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
18bb0 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
18bc0 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
18bd0 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
18be0 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
18bf0 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
18c00 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
18c10 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
18c20 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
18c30 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
18c40 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
18c50 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
18c60 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
18c70 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
18c80 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
18c90 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
18ca0 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
18cb0 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
18cc0 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
18cd0 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
18ce0 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
18cf0 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
18d00 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
18d10 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
18d20 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
18d30 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
18d40 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
18d50 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
18d60 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
18d70 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
18d80 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
18d90 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
18da0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
18db0 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
18dc0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
18dd0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
18de0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
18df0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
18e00 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
18e10 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
18e20 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
18e30 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
18e40 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
18e50 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
18e60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18e70 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
18e80 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
18e90 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
18ea0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
18eb0 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
18ec0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
18ed0 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
18ee0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
18ef0 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
18f00 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
18f10 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
18f20 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
18f30 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
18f40 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
18f50 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
18f60 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
18f70 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
18f80 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
18f90 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
18fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18fb0 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
18fc0 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
18fd0 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
18fe0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
18ff0 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
19000 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
19010 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
19020 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
19030 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
19040 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
19050 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
19060 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
19070 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19080 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
19090 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
190a0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
190b0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
190c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
190d0 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
190e0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
190f0 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
19100 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19110 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
19120 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
19130 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
19140 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
19150 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
19160 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
19170 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
19180 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
19190 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
191a0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
191b0 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
191c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
191d0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
191e0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
191f0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
19200 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
19210 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
19220 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
19230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
19250 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
19260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19270 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
19280 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
19290 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
192a0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
192b0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
192c0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
192d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
192e0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
192f0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
19300 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
19310 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
19320 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
19330 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
19340 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
19350 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
19360 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
19370 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
19380 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
19390 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
193a0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
193b0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
193c0 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
193d0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
193e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
193f0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
19400 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
19410 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
19420 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
19430 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
19440 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
19450 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
19460 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
19470 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
19480 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
19490 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
194a0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
194b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
194c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
194d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
194e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
194f0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
19500 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
19510 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
19520 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
19530 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
19540 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
19550 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
19560 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
19570 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
19580 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
19590 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
195a0 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
195b0 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
195c0 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
195d0 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
195e0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
195f0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
19600 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
19610 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
19620 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
19630 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
19640 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
19650 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
19660 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
19670 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
19680 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
19690 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
196a0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
196b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
196c0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
196d0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
196e0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
196f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
19700 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
19710 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
19720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
19730 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
19740 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
19750 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
19760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19770 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
19780 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19790 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
197a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
197b0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
197c0 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
197d0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
197e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
197f0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
19800 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
19810 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19820 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
19830 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
19840 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
19850 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
19860 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
19870 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19880 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
19890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
198a0 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
198b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
198c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
198d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
198e0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
198f0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
19900 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
19910 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
19920 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
19930 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
19940 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19950 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
19960 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19970 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
19980 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
19990 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58   }.    iTab = pX
199a0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
199b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
199c0 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
199d0 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
199e0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
199f0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
19a00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
19a10 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20  TI_OR)==0 );.   
19a20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
19a30 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  |= WHERE_IN_ABLE
19a40 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
19a50 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b  ->u.in.nIn==0 ){
19a60 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  .      pLevel->a
19a70 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
19a80 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
19aa0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a  el->u.in.nIn++;.
19ab0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19ac0 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20  .aInLoop =.     
19ad0 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
19ae0 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
19af0 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  >db, pLevel->u.i
19b00 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  n.aInLoop,.     
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
19b30 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
19b40 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d  Loop[0])*pLevel-
19b50 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20  >u.in.nIn);.    
19b60 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  pIn = pLevel->u.
19b70 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20  in.aInLoop;.    
19b80 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20  if( pIn ){.     
19b90 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   pIn += pLevel->
19ba0 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20  u.in.nIn - 1;.  
19bb0 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20      pIn->iCur = 
19bc0 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  iTab;.      if( 
19bd0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19be0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
19bf0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
19c00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19c10 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
19c20 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
19c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19c40 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
19c50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
19c60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
19c70 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65  mn, iTab, 0, iRe
19c80 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
19c90 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f    pIn->eEndLoopO
19ca0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
19cb0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
19cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19cd0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
19ce0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
19cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
19d00 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
19d10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
19d20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
19d30 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
19d40 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
19d50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19d60 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
19d70 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
19d80 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
19d90 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
19da0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  dex..**.** For e
19db0 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
19dc0 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
19dd0 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
19de0 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
19df0 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
19e00 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
19e10 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
19e20 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
19e30 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
19e40 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
19e50 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
19e60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
19e70 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
19e80 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
19e90 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
19ea0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
19eb0 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
19ec0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
19ed0 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
19ee0 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
19ef0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
19f00 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
19f10 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
19f20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
19f30 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
19f40 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
19f50 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
19f60 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
19f70 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
19f80 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
19f90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
19fa0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
19fb0 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
19fc0 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
19fd0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
19fe0 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
19ff0 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
1a000 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
1a010 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
1a020 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
1a030 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
1a040 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
1a050 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
1a060 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a070 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
1a080 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
1a090 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a0a0 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
1a0b0 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
1a0c0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
1a0d0 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
1a0e0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
1a0f0 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
1a100 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
1a110 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1a120 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
1a130 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
1a140 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
1a150 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
1a160 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
1a170 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
1a180 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
1a190 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1a1a0 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
1a1b0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
1a1c0 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
1a1d0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
1a1e0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
1a1f0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
1a200 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
1a210 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
1a220 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1a230 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
1a240 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1a250 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
1a260 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
1a270 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
1a280 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
1a290 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
1a2a0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
1a2b0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
1a2c0 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
1a2d0 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
1a2e0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
1a2f0 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
1a300 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
1a310 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
1a320 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
1a330 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1a340 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1a350 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
1a360 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
1a370 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
1a380 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
1a390 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
1a3a0 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
1a3b0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
1a3c0 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
1a3d0 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
1a3e0 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
1a3f0 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
1a400 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
1a410 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1a420 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
1a430 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
1a440 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
1a450 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
1a460 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
1a470 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
1a480 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
1a490 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
1a4a0 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
1a4b0 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
1a4c0 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
1a4d0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
1a4e0 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
1a4f0 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1a500 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
1a510 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
1a520 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1a530 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a540 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a550 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a560 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1a570 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
1a580 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
1a590 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
1a5a0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52  ding */.  int bR
1a5b0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
1a5c0 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f  /* Reverse the o
1a5d0 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61  rder of IN opera
1a5e0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  tors */.  int nE
1a5f0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
1a600 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1a610 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
1a620 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
1a630 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
1a640 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
1a650 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
1a660 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
1a670 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  {.  int nEq;    
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1a6a0 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
1a6b0 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
1a6c0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
1a6d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
1a6e0 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
1a6f0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a700 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1a710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a720 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1a730 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
1a740 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  his loop */.  Wh
1a750 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1a760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a770 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
1a780 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  nt term */.  Whe
1a790 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a7b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
1a7c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  ct */.  int j;  
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1a7f0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
1a800 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1a810 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1a820 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1a830 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a850 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
1a860 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
1a870 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
1a8a0 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
1a8b0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
1a8c0 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
1a8d0 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
1a8e0 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
1a8f0 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70  ndex. */.  pLoop
1a900 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1a910 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  p;.  assert( (pL
1a920 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1a930 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1a940 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d  E)==0 );.  nEq =
1a950 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1a960 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c  nEq;.  pIdx = pL
1a970 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a980 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dex;.  assert( p
1a990 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Idx!=0 );..  /* 
1a9a0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1a9b0 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
1a9c0 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
1a9d0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
1a9e0 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
1a9f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1aa00 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
1aa10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1aa20 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
1aa30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1aa40 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
1aa50 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1aa60 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
1aa70 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
1aa80 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
1aa90 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
1aaa0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
1aab0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1aac0 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
1aad0 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
1aae0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
1aaf0 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1ab00 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
1ab10 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
1ab20 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
1ab30 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
1ab40 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1ab50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1ab60 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
1ab70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ab80 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
1ab90 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
1aba0 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
1abb0 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
1abc0 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
1abd0 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
1abe0 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
1abf0 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
1ac00 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
1ac10 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1ac20 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
1ac30 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1ac40 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1ac50 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72  VIRTUAL );.    r
1ac60 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
1ac70 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1ac80 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1ac90 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
1aca0 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
1acb0 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
1acc0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
1acd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1ace0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1acf0 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
1ad00 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
1ad10 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
1ad20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ad30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ad40 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
1ad50 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
1ad60 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1ad70 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1ad80 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ad90 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
1ada0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1adb0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1adc0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1add0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
1ade0 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
1adf0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1ae00 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
1ae10 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1ae20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ae30 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1ae40 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1ae50 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
1ae60 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
1ae70 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
1ae80 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1ae90 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1aea0 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
1aeb0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1aec0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1aed0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1aee0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1aef0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1af00 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1af10 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1af20 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
1af30 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1af40 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1af50 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1af60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1af70 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
1af80 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
1af90 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ase;.}..#ifndef 
1afa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1afb0 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  AIN./*.** This r
1afc0 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
1afd0 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e  er for explainIn
1afe0 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77  dexRange() below
1aff0 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64  .**.** pStr hold
1b000 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  s the text of an
1b010 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1b020 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
1b030 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20   up one term.** 
1b040 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
1b050 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
1b060 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20  new term to the 
1b070 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65  end of the expre
1b080 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20  ssion..** Terms 
1b090 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
1b0a0 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20   AND so add the 
1b0b0 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73  "AND" text for s
1b0c0 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
1b0d0 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  uent.** terms on
1b0e0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1b0f0 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64  id explainAppend
1b100 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d  Term(.  StrAccum
1b110 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20   *pStr,         
1b120 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1b130 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
1b140 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20   built */.  int 
1b150 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iTerm,          
1b160 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1b170 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20   of this term.  
1b180 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f  First is zero */
1b190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b1a0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f  Column,        /
1b1b0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1b1c0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
1b1d0 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20  char *zOp       
1b1e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b1f0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   the operator */
1b200 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20  .){.  if( iTerm 
1b210 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
1b220 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
1b230 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c  AND ", 5);.  sql
1b240 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b250 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  nd(pStr, zColumn
1b260 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
1b270 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1b280 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  Str, zOp, 1);.  
1b290 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b2a0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
1b2b0 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   1);.}../*.** Ar
1b2c0 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
1b2d0 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
1b2e0 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
1b2f0 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
1b300 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
1b310 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1b320 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
1b330 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
1b340 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
1b350 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  f the subset of 
1b360 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e  table rows scann
1b370 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65  ed by the strate
1b380 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f  gy in the form o
1b390 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72  f an.** SQL expr
1b3a0 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61  ession. Or, if a
1b3b0 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e  ll rows are scan
1b3c0 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ned, NULL is ret
1b3d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  urned..**.** For
1b3e0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1b3f0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1b400 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1b410 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62   WHERE a=1 AND b
1b420 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e  >2;.**.** is run
1b430 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1b440 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
1b450 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1b460 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a  tion returns a.*
1b470 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72  * string similar
1b480 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d   to:.**.**   "a=
1b490 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a  ? AND b>?".**.**
1b4a0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
1b4b0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  inter points to 
1b4c0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1b4d0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1b4e0 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
1b4f0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1b500 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1b510 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75  r to free the bu
1b520 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a  ffer when it is.
1b530 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  ** no longer req
1b540 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
1b550 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e   char *explainIn
1b560 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33  dexRange(sqlite3
1b570 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
1b580 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70  *pLoop, Table *p
1b590 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
1b5a0 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1b5b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b5c0 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
1b5d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b5e0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
1b5f0 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
1b600 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61  ->aCol;.  int *a
1b610 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
1b620 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
1b630 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
1b640 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c  f( nEq==0 && (pL
1b650 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
1b660 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
1b670 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1b680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1b690 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
1b6a0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
1b6b0 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49  &txt, 0, 0, SQLI
1b6c0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
1b6d0 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20    txt.db = db;. 
1b6e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1b6f0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28  Append(&txt, " (
1b700 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 2);.  for(i=0
1b710 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<nEq; i++){. 
1b720 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1b730 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43  Term(&txt, i, aC
1b740 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  ol[aiColumn[i]].
1b750 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d  zName, "=");.  }
1b760 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
1b770 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
1b780 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1b790 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1b7a0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
1b7b0 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
1b7c0 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
1b7d0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
1b7e0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1b7f0 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
1b800 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
1b810 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1b820 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1b830 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1b840 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
1b850 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
1b860 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
1b870 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
1b880 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1b890 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
1b8a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b8b0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1b8c0 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
1b8d0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
1b8e0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
1b8f0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1b900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1b910 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
1b920 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
1b930 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
1b940 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
1b950 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
1b960 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
1b970 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
1b980 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
1b990 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
1b9a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
1b9b0 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
1b9c0 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
1b9d0 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
1b9e0 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
1b9f0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
1ba00 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
1ba10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1ba20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
1ba30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ba40 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba60 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
1ba70 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
1ba80 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1ba90 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
1baa0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
1bab0 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
1bac0 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
1bad0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
1bb00 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
1bb10 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
1bb20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1bb40 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
1bb50 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1bb60 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
1bb70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1bb80 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
1bb90 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1bba0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
1bbb0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1bbc0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
1bbd0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1bbe0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1bbf0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
1bc00 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
1bc10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1bc20 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1bc30 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
1bc40 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
1bc50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1bc60 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
1bc70 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
1bc80 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
1bc90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bca0 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
1bcb0 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
1bcc0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
1bcd0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
1bce0 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
1bcf0 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
1bd00 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
1bd10 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
1bd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd30 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
1bd40 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
1bd50 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
1bd60 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd80 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
1bd90 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1bda0 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
1bdb0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1bdc0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1bdd0 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
1bde0 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70  s loop */..    p
1bdf0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
1be00 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
1be10 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
1be20 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
1be30 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
1be40 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
1be50 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
1be60 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
1be70 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
1be80 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
1be90 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
1bea0 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
1beb0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
1bec0 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
1bed0 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
1bee0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1bef0 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
1bf00 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
1bf10 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
1bf20 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
1bf30 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
1bf40 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1bf50 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
1bf60 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
1bf70 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
1bf80 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1bf90 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1bfa0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1bfb0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
1bfc0 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
1bfd0 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
1bfe0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1bff0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c000 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c010 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
1c020 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
1c030 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
1c040 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1c050 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1c060 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c070 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c080 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
1c090 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
1c0a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c0b0 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
1c0c0 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
1c0d0 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20  ALTABLE))==0.   
1c0e0 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f    && ALWAYS(pLoo
1c0f0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1c100 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  x!=0).    ){.   
1c110 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
1c120 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
1c130 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70  nge(db, pLoop, p
1c140 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1c150 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c160 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c170 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
1c180 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
1c190 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f  RE_AUTO_INDEX) ?
1c1a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c1b0 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41       "%s USING A
1c1c0 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58  UTOMATIC %sINDEX
1c1d0 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20  %.0s%s" :.      
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
1c1f0 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25   USING %sINDEX %
1c200 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20  s%s"), .        
1c210 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66         zMsg, ((f
1c220 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1c230 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49  _ONLY) ? "COVERI
1c240 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  NG " : ""),.    
1c250 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1c260 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1c270 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29  ->zName, zWhere)
1c280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1c290 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
1c2a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1c2b0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c2c0 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
1c2d0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1c2e0 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
1c2f0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c300 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c310 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
1c320 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1c330 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
1c340 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1c350 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1c360 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
1c370 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1c380 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c390 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1c3a0 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
1c3b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c3c0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
1c3d0 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
1c3e0 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
1c3f0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c400 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c410 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c420 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
1c430 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1c440 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1c450 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1c460 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1c470 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c480 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c490 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
1c4a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c4b0 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26  f( ALWAYS(flags&
1c4c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1c4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c4e0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c4f0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c500 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
1c510 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c520 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c530 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c540 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
1c550 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
1c560 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1c570 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c580 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c590 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1c5a0 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1c5b0 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1c5e0 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
1c5f0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1c600 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c610 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c620 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c630 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
1c640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c650 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1c660 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
1c670 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
1c680 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1c690 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1c6a0 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1c6b0 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
1c6c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c6d0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
1c6e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c6f0 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1c700 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1c710 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1c720 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1c730 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1c740 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1c750 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1c760 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1c770 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1c780 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1c790 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1c7a0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1c7b0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1c7c0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1c7d0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1c7e0 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1c7f0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1c800 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
1c810 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1c820 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1c830 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1c840 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1c850 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1c860 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1c870 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1c880 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c890 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1c8a0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1c8b0 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1c8c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1c8d0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1c8e0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1c8f0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1c900 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1c910 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c920 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1c930 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1c940 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1c950 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1c960 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1c970 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1c980 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1c990 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1c9a0 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1c9b0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1c9c0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1c9d0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1c9e0 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1c9f0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1ca00 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1ca10 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1ca20 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1ca30 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1ca40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca60 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1ca70 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1ca80 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1ca90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1caa0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1cab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1cae0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
1caf0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb10 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
1cb20 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
1cb30 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
1cb40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1cb50 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
1cb60 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1cb70 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1cb80 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
1cbb0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
1cbc0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
1cbd0 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1cbf0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
1cc00 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
1cc10 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
1cc20 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
1cc30 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
1cc40 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
1cc50 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
1cc60 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
1cc70 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
1cc80 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1cc90 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
1cca0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
1ccb0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f  .  Bitmask newNo
1ccc0 74 52 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20  tReady;      /* 
1ccd0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1cce0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1ccf0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
1cd00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1cd10 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
1cd20 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
1cd30 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
1cd40 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1cd50 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1cd60 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1cd70 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1cd80 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1cd90 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1cda0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1cdb0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1cdc0 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66  .  bRev = (pWInf
1cdd0 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76  o->revMask>>iLev
1cde0 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62  el)&1;.  omitTab
1cdf0 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  le = (pLoop->wsF
1ce00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1ce10 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
1ce20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1ce30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1ce40 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
1ce50 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  )==0;.  VdbeNoop
1ce60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
1ce70 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22  in Join Loop %d"
1ce80 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f  , iLevel));..  /
1ce90 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
1cea0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
1ceb0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
1cec0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
1ced0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1cee0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
1cef0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
1cf00 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
1cf10 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
1cf20 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
1cf30 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
1cf40 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
1cf50 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
1cf60 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
1cf70 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
1cf80 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
1cf90 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
1cfa0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
1cfb0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
1cfc0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1cfd0 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
1cfe0 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
1cff0 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
1d000 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
1d010 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
1d020 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
1d030 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1d040 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
1d050 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
1d060 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
1d070 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1d080 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1d090 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
1d0a0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
1d0b0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
1d0c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d0d0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
1d0e0 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
1d0f0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1d100 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
1d110 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
1d120 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
1d130 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
1d140 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
1d150 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
1d160 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
1d170 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
1d180 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
1d190 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
1d1a0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
1d1b0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
1d1c0 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
1d1d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1d1e0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
1d1f0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1d200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d210 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
1d220 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
1d230 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1d240 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
1d250 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
1d260 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g"));.  }..  /* 
1d270 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  Special case of 
1d280 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75  a FROM clause su
1d290 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74  bquery implement
1d2a0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
1d2b0 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ne */.  if( pTab
1d2c0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
1d2d0 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
1d2e0 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
1d2f0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
1d300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d310 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1d320 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  r, pTabItem->add
1d330 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59  rFillSub-1, regY
1d340 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65  ield);.    pLeve
1d350 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
1d360 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1d370 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
1d380 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1d390 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
1d3a0 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25   of co-routine %
1d3b0 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  s", pTabItem->pT
1d3c0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
1d3d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d3e0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
1d3f0 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b  Yield+1, addrBrk
1d400 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1d410 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1d420 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1d430 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1d440 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1d450 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d460 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1d470 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1d480 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1d490 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1d4a0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1d4b0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1d4c0 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1d4d0 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1d4e0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1d4f0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1d500 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1d510 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1d520 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1d530 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1d540 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1d550 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
1d560 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1d570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
1d580 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1d590 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1d5a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1d5b0 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
1d5c0 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1d5d0 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
1d5e0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1d5f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1d600 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
1d610 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
1d620 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d630 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
1d640 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1d650 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
1d660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1d670 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1d680 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
1d690 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1d6a0 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1d6b0 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
1d6c0 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
1d6d0 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1d6e0 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
1d6f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d700 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1d710 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
1d720 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1d730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d760 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
1d770 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
1d780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d790 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1d7a0 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
1d7b0 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
1d7c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d7d0 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
1d7e0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
1d7f0 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1d820 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1d840 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1d850 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
1d860 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
1d870 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1d880 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1d890 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1d8a0 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c  Constraint && j<
1d8b0 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
1d8c0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74  if( (pLoop->u.vt
1d8d0 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
1d8e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
1d8f0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1d900 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1d910 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1d920 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
1d930 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
1d940 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1d950 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1d960 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
1d970 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1d980 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1d990 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1d9a0 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
1d9b0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
1d9c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1d9d0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1d9e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1d9f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1da00 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1da10 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1da20 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1da30 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1da40 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1da50 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1da60 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1da70 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1da80 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1da90 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1daa0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1dab0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1dac0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1dad0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1dae0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1daf0 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1db00 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1db10 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1db20 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1db30 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1db40 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1db50 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1db60 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1db70 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1db80 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1db90 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1dba0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1dbb0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1dbc0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
1dbd0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1dbe0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1dbf0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1dc00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1dc10 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1dc20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1dc30 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1dc40 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1dc50 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
1dc60 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1dc70 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1dc80 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
1dc90 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
1dca0 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1dcb0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1dcc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dcd0 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
1dce0 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
1dcf0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
1dd00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1dd10 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
1dd20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
1dd30 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
1dd40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1dd50 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1dd60 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1dd70 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1dd80 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1dd90 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1dda0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1ddb0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1ddc0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1ddd0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1dde0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1ddf0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1de00 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1de10 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1de20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1de30 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1de40 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1de50 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1de60 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1de70 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1de80 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1de90 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1dea0 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1deb0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1dec0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1ded0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1dee0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1def0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1df00 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1df10 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1df20 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1df30 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1df40 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1df50 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1df60 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1df70 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1df80 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1df90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1dfa0 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1dfb0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1dfc0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1dfd0 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1dfe0 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1dff0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1e000 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1e010 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1e020 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1e030 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1e040 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1e050 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1e060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e070 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1e080 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1e090 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1e0a0 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1e0b0 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1e0c0 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1e0d0 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1e0e0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1e0f0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1e100 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1e110 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1e120 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1e130 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1e140 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1e150 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1e160 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1e170 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1e180 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1e190 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1e1a0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1e1b0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20  */  OP_SeekGt,. 
1e1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1e1d0 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65  LE */  OP_SeekLe
1e1e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1e1f0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1e200 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLt,.           
1e210 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1e220 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a  SeekGe.      };.
1e230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e240 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1e250 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1e260 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1e270 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1e280 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1e290 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1e2a0 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1e2b0 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1e2c0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1e2d0 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1e2e0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1e2f0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
1e300 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
1e310 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e320 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1e330 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1e340 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1e350 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e360 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
1e370 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1e380 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1e390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e3a0 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1e3b0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
1e3c0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1e3d0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
1e3e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e3f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e400 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1e410 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1e420 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1e430 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1e440 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1e450 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1e460 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1e470 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
1e480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1e490 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1e4a0 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1e4b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1e4c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1e4d0 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1e4e0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e4f0 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1e500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1e510 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e520 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1e530 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1e540 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1e550 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1e560 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1e570 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1e580 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1e590 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1e5a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e5b0 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20   (pEnd->wtFlags 
1e5c0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1e5d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e5e0 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  se( pEnd->leftCu
1e5f0 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1e600 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   Transitive cons
1e610 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1e620 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1e630 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e640 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1e650 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1e660 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1e670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e680 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1e690 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1e6a0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1e6b0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1e6c0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1e6d0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1e6e0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1e6f0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1e700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1e710 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1e720 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1e730 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1e740 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e750 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1e760 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1e770 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e780 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1e790 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1e7a0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1e7b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e7c0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1e7d0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1e7e0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1e7f0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
1e800 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
1e810 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
1e820 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1e830 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1e840 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1e850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1e870 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
1e880 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1e890 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1e8a0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1e8b0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1e8c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e8d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
1e8e0 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
1e8f0 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
1e900 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1e910 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1e920 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
1e930 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
1e940 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1e950 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1e960 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e970 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
1e980 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1e990 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1e9a0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1e9b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1e9c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1e9d0 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1e9e0 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1e9f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ea00 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1ea10 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1ea20 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1ea30 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1ea40 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1ea50 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1ea60 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1ea70 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1ea80 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1ea90 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1eaa0 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1eab0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1eac0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1ead0 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1eae0 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1eaf0 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1eb00 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1eb10 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1eb20 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1eb30 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1eb40 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1eb50 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1eb60 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1eb70 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1eb80 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1eb90 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1eba0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1ebb0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1ebc0 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1ebd0 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1ebe0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1ebf0 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1ec00 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ec10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ec20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1ec30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ec40 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1ec50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ec60 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1ec70 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1ec80 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1ec90 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1eca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ecb0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1ecc0 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1ecd0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1ece0 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1ecf0 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1ed00 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1ed10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1ed20 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1ed30 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1ed40 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1ed50 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1ed60 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ed70 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1ed80 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1ed90 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1eda0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1edb0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1edc0 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1edd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ede0 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1edf0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1ee00 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1ee10 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1ee20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1ee30 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1ee40 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1ee50 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1ee60 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1ee70 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1ee80 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1ee90 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1eea0 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1eeb0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1eec0 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1eed0 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1eee0 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1eef0 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1ef00 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1ef10 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1ef20 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1ef30 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1ef40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ef50 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1ef60 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1ef70 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1ef80 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
1ef90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1efa0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1efb0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1efc0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1efd0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
1efe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1eff0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f000 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1f010 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1f020 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
1f030 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1f040 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f050 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1f060 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1f070 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
1f080 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1f090 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f0a0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1f0b0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1f0c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f0d0 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
1f0e0 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1f100 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
1f110 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
1f120 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1f130 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1f140 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1f150 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f160 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
1f170 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1f180 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
1f190 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1f1a0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
1f1b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f  >u.btree.nEq;  /
1f1c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1f1d0 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
1f1e0 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
1f1f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f200 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1f210 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
1f220 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
1f230 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1f260 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
1f270 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
1f280 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2a0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1f2b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1f2c0 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1f2d0 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1f2e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1f2f0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1f300 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1f310 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1f320 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1f330 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1f340 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1f350 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1f360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f370 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1f380 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1f390 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1f3a0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1f3b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f3c0 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1f3d0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1f3e0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1f3f0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1f400 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1f410 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1f420 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1f430 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1f440 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f450 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1f460 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1f470 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1f480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f490 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1f4a0 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1f4b0 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1f4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f4d0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1f4e0 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1f4f0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1f500 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f510 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1f520 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1f530 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1f540 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f550 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1f560 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1f570 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1f580 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1f590 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1f5a0 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1f5b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1f5c0 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
1f5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5e0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1f5f0 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1f600 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
1f610 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
1f620 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
1f630 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
1f640 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20  el->iIdxCur;..  
1f650 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
1f660 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
1f670 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
1f680 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
1f690 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73   .    ** was pas
1f6a0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1f6b0 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tion to implemen
1f6c0 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  t a "SELECT min(
1f6d0 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20  x) ..." .    ** 
1f6e0 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20  query, then the 
1f6f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79  caller will only
1f700 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20   allow the loop 
1f710 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a  to run for.    *
1f720 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61  * a single itera
1f730 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
1f740 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1f750 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20  row returned.   
1f760 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68   ** should not h
1f770 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ave a NULL value
1f780 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20   stored in 'x'. 
1f790 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73  If column 'x' is
1f7a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73  .    ** the firs
1f7b0 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20  t one after the 
1f7c0 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  nEq equality con
1f7d0 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
1f7e0 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68  index,.    ** th
1f7f0 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65  is requires some
1f800 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
1f810 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  g..    */.    if
1f820 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
1f830 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1f840 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
1f850 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42   && (pWInfo->bOB
1f860 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20  Sat!=0).     && 
1f870 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
1f880 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1f890 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
1f8a0 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
1f8b0 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
1f8c0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
1f8d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
1f8e0 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
1f8f0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
1f900 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
1f910 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1f920 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1f930 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1f940 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f950 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1f960 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1f970 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1f980 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1f990 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1f9a0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1f9b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1f9c0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1f9d0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1f9e0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1f9f0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1fa00 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1fa10 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1fa20 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1fa30 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1fa40 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
1fa50 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1fa60 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1fa70 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
1fa80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1fa90 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
1faa0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1fab0 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
1fac0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
1fad0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
1fae0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
1faf0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
1fb00 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
1fb10 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
1fb20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
1fb30 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
1fb40 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
1fb50 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78  ,pLevel,bRev,nEx
1fb60 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66  traReg,&zStartAf
1fb70 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20  f);.    zEndAff 
1fb80 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1fb90 70 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  p(db, zStartAff)
1fba0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1fbb0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1fbc0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
1fbd0 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
1fbe0 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
1fbf0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
1fc00 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
1fc10 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
1fc20 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
1fc30 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
1fc40 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
1fc50 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
1fc60 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
1fc70 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
1fc80 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1fc90 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43  f( (nEq<pIdx->nC
1fca0 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28  olumn && bRev==(
1fcb0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1fcc0 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
1fcd0 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
1fce0 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43  bRev && pIdx->nC
1fcf0 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20  olumn==nEq).    
1fd00 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
1fd10 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
1fd20 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
1fd30 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
1fd40 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1fd50 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1fd60 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1fd70 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1fd80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1fd90 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1fda0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1fdb0 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
1fdc0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1fdd0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
1fde0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1fdf0 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
1fe00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1fe10 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
1fe20 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1fe30 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
1fe40 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
1fe50 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
1fe60 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
1fe70 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1fe80 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
1fe90 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
1fea0 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
1feb0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1fec0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
1fed0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1fee0 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
1fef0 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
1ff00 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
1ff10 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
1ff20 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
1ff30 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
1ff40 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
1ff50 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
1ff60 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ff70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
1ff80 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
1ff90 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1ffa0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1ffb0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1ffc0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
1ffd0 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
1ffe0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1fff0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
20000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20010 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
20020 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20030 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
20040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20050 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
20060 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20070 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
20080 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
20090 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
200a0 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
200b0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
200c0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
200d0 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
200e0 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
200f0 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
20100 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
20110 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
20120 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
20130 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
20140 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
20150 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
20160 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
20170 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
20180 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
20190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
201a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
201b0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
201c0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
201d0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
201e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
201f0 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
20200 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20220 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
20230 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
20240 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
20250 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
20260 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
20270 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
20280 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
20290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
202a0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
202b0 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
202c0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
202d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
202e0 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
202f0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20300 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
20310 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
20320 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
20330 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
20340 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
20350 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
20360 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20370 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
20380 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
20390 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
203a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
203b0 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
203c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
203d0 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
203e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
203f0 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
20400 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20410 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
20420 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20430 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
20440 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20450 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
20460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
20470 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
20480 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
20490 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
204a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
204b0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
204c0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
204d0 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
204e0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
204f0 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
20500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
20510 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
20520 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
20530 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
20540 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
20550 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
20560 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20570 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
20580 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
20590 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
205a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
205b0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
205c0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
205d0 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
205e0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
205f0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
20600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20610 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
20620 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
20630 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
20640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20650 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
20660 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20670 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
20680 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
20690 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
206a0 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
206b0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
206c0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
206d0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
206e0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
206f0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
20700 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
20710 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
20720 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
20730 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
20740 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
20750 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20760 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20770 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
20780 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
207a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
207b0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
207c0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
207d0 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
207e0 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
207f0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
20800 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
20810 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
20820 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
20830 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
20840 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
20850 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
20860 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
20870 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20880 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
20890 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
208a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
208b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
208c0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
208d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
208e0 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  EndAff);..    /*
208f0 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
20900 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
20910 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
20920 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
20930 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
20940 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
20950 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
20960 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
20970 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
20980 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
20990 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
209a0 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
209b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
209c0 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
209d0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
209e0 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
209f0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
20a00 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
20a10 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
20a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20a30 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
20a40 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
20a50 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
20a60 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
20a70 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
20a80 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
20a90 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
20aa0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
20ab0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
20ac0 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
20ad0 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
20ae0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
20af0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
20b00 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
20b10 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
20b20 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
20b30 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
20b40 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
20b50 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
20b60 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
20b70 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
20b80 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
20b90 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
20ba0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
20bb0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
20bc0 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
20bd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
20be0 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
20bf0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
20c00 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
20c10 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
20c20 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20  LIMIT))!=0 ){.  
20c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20c40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
20c50 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
20c60 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
20c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20c80 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
20c90 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
20ca0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
20cb0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20cc0 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a  se, r1);..    /*
20cd0 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
20ce0 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
20cf0 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
20d00 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
20d10 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
20d20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20d30 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
20d40 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61  .    if( !omitTa
20d50 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  ble ){.      iRo
20d60 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
20d70 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
20d80 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
20d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20da0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20db0 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
20dc0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
20dd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20de0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
20df0 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
20e00 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
20e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20e20 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75  (v, OP_Seek, iCu
20e30 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20  r, iRowidReg);  
20e40 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
20e50 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
20e60 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
20e70 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
20e80 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
20e90 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
20ea0 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
20eb0 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
20ec0 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
20ed0 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
20ee0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20ef0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20f00 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a  WHERE_ONEROW ){.
20f10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
20f20 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
20f30 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
20f40 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
20f50 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
20f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20f70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
20f80 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
20f90 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
20fa0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  Cur;.    if( (pL
20fb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
20fc0 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
20fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
20fe0 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
20ff0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21000 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
21010 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21020 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
21030 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
21040 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
21050 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
21060 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
21070 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21080 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
21090 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
210a0 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
210b0 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
210c0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
210d0 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
210e0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
210f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
21100 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
21110 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
21120 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
21130 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
21140 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
21150 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
21160 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
21170 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
21180 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21190 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
211a0 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
211b0 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
211c0 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
211d0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
211e0 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
211f0 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
21200 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
21210 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
21220 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
21230 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
21240 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
21250 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
21260 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
21270 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
21280 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
21290 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
212a0 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
212b0 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
212c0 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
212d0 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
212e0 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
212f0 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
21300 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
21310 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
21320 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
21330 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
21340 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
21350 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
21360 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
21370 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
21380 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
21390 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
213a0 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
213b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
213c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
213d0 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
213e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
213f0 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
21400 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
21410 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
21420 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
21430 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
21440 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
21450 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
21460 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
21470 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
21480 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
21490 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
214a0 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
214b0 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
214c0 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
214d0 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
214e0 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
214f0 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
21500 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21510 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
21520 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
21530 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
21540 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
21550 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21560 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
21570 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
21580 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
21590 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
215a0 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
215b0 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
215c0 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
215d0 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
215e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
215f0 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
21600 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
21610 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
21620 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
21630 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21640 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
21650 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
21660 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
21670 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
21680 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
21690 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
216a0 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
216b0 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
216c0 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
216d0 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
216e0 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
216f0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
21700 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
21710 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
21720 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
21730 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
21740 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
21750 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
21760 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
21770 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
21780 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
21790 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
217a0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
217b0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
217c0 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
217d0 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
217e0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
217f0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21810 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
21820 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
21830 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
21840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21860 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
21870 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
21880 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
21890 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
218a0 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
218b0 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
218c0 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
218d0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
21900 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
21910 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
21920 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
21930 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
21940 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
21950 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
21960 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21990 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
219a0 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
219c0 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
219d0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
219e0 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  /.   .    pTerm 
219f0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
21a00 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
21a10 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
21a20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
21a30 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
21a40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21a50 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
21a60 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
21a70 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
21a80 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
21a90 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76  fo->wc;.    pLev
21aa0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75  el->op = OP_Retu
21ab0 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rn;.    pLevel->
21ac0 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a  p1 = regReturn;.
21ad0 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
21ae0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20   new SrcList in 
21af0 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e  pOrTab containin
21b00 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
21b10 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a  g scanned.    **
21b20 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e   by this loop in
21b30 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61   the a[0] slot a
21b40 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20  nd all notReady 
21b50 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d  tables in a[1..]
21b60 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21b70 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  his becomes the 
21b80 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72  SrcList in the r
21b90 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
21ba0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21bb0 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
21bc0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
21bd0 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  vel>1 ){.      i
21be0 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20  nt nNotReady;   
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c00 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   The number of n
21c10 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a  otReady tables *
21c20 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  /.      struct S
21c30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69  rcList_item *ori
21c40 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69  gSrc;     /* Ori
21c50 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61  ginal list of ta
21c60 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  bles */.      nN
21c70 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f  otReady = pWInfo
21c80 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65  ->nLevel - iLeve
21c90 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72  l - 1;.      pOr
21ca0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Tab = sqlite3Sta
21cb0 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20  ckAllocRaw(db,. 
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
21ce0 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
21cf0 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
21d00 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
21d10 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
21d20 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
21d30 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
21d40 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28  ->nAlloc = (u8)(
21d50 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
21d60 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
21d70 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
21d80 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
21d90 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
21da0 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
21db0 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
21dc0 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
21dd0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
21de0 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
21df0 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
21e00 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
21e10 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
21e20 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
21e30 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
21e40 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
21e50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
21e70 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
21e80 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
21e90 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
21ea0 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
21eb0 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
21ec0 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
21ed0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
21ee0 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
21ef0 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
21f00 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
21f10 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
21f20 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
21f30 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
21f40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
21f50 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
21f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
21f70 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
21f80 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
21f90 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
21fa0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
21fb0 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
21fc0 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
21fd0 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
21fe0 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
21ff0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
22000 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
22010 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
22020 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
22030 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
22040 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
22050 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
22060 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
22070 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
22080 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
22090 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
220a0 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
220b0 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
220c0 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
220d0 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
220e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
220f0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
22100 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
22110 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
22120 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65  {.      regRowse
22130 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
22140 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77  em;.      regRow
22150 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
22160 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
22170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22180 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
22190 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  owset);.    }.  
221a0 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c    iRetInit = sql
221b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
221c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
221d0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
221e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67    /* If the orig
221f0 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
22200 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f  e is z of the fo
22210 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f  rm:  (x1 OR x2 O
22220 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20  R ...) AND y.   
22230 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65   ** Then for eve
22240 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c  ry term xN, eval
22250 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65  uate as the sube
22260 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e  xpression: xN AN
22270 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  D z.    ** That 
22280 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20  way, terms in y 
22290 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65  that are factore
222a0 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75  d into the disju
222b0 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  nction will.    
222c0 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  ** be picked up 
222d0 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65  by the recursive
222e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
222f0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65  3WhereBegin() be
22300 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  low..    **.    
22310 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63  ** Actually, eac
22320 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
22330 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
22340 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65  "xN AND w" where
22350 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65   w is.    ** the
22360 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74   "interesting" t
22370 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d  erms of z - term
22380 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f  s that did not o
22390 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a  riginate in the.
223a0 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49      ** ON or USI
223b0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  NG clause of a L
223c0 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65  EFT JOIN, and te
223d0 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61  rms that are usa
223e0 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69  ble as .    ** i
223f0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
22400 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d     ** This optim
22410 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c  ization also onl
22420 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65  y applies if the
22430 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
22440 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69  .) term.    ** i
22450 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
22460 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
22470 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
22480 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b  .    ** See tick
22490 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  et http://www.sq
224a0 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
224b0 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20  o/f2369304e4.   
224c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d   */.    if( pWC-
224d0 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20  >nTerm>1 ){.    
224e0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
224f0 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
22500 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d  iTerm<pWC->nTerm
22510 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
22520 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
22530 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  = pWC->a[iTerm].
22540 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
22550 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( &pWC->a[iTerm
22560 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e  ] == pTerm ) con
22570 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
22580 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
22590 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
225a0 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
225b0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
225c0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
225d0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49  lags & (TERM_ORI
225e0 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
225f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
22600 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
22610 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
22620 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22630 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
22640 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
22650 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
22660 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
22670 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
22680 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
22690 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
226a0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
226b0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
226c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
226d0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
226e0 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
226f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
22700 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
22710 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
22720 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
22730 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
22740 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
22750 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
22760 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
22770 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
22780 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
22790 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
227a0 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
227b0 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
227c0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
227d0 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
227e0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
227f0 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
22800 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  pOrTerm->pExpr;.
22810 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
22820 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73  Expr && !ExprHas
22830 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72  Property(pOrExpr
22840 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22850 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
22860 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
22870 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
22880 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
22890 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
228a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
228b0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
228c0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
228d0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
228e0 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
228f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
22900 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
22910 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
22920 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
22940 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
22950 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f  OSE | WHERE_AND_
22960 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20  ONLY |.         
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
22980 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
22990 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
229a0 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29  E_ONLY, iCovCur)
229b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
229c0 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
229d0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
229e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
229f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
22a00 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  SubWInfo ){.    
22a10 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
22a20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20  *pSubLoop;.     
22a30 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53       explainOneS
22a40 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  can(.           
22a50 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61     pParse, pOrTa
22a60 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
22a70 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65  [0], iLevel, pLe
22a80 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20  vel->iFrom, 0.  
22a90 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
22aa0 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
22ab0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22ac0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
22ad0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
22ae0 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
22af0 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
22b00 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
22b10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
22b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20  ;.            r 
22b30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22b40 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
22b50 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  e, pTabItem->pTa
22b60 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20  b, -1, iCur, .  
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c         regRowid,
22ba0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
22bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22bc0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
22bd0 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
22be0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22c10 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
22c20 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20   r, iSet);.     
22c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22c50 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
22c60 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
22c70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
22c80 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
22c90 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
22ca0 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
22cb0 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
22cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
22cd0 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
22ce0 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
22cf0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
22d00 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
22d10 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
22d20 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
22d30 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
22d40 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
22d50 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
22d60 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
22d70 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
22d80 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
22d90 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
22da0 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
22db0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
22dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
22dd0 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
22de0 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
22df0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
22e00 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
22e10 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
22e20 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
22e30 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
22e40 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
22e50 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
22e60 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
22e70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22e80 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
22e90 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
22ea0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
22eb0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
22ec0 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
22ed0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
22ee0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22ef0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
22f00 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
22f10 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
22f20 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
22f30 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
22f40 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
22f50 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
22f60 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
22f70 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
22f80 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
22f90 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
22fa0 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
22fb0 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
22fc0 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
22fd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
22fe0 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
22ff0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
23000 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
23010 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
23020 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
23030 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
23040 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
23050 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
23060 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
23070 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
23080 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
23090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
230a0 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
230b0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
230c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
230d0 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
230e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
230f0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
23100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
23110 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
23120 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
23130 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
23140 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
23150 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
23160 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
23170 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
23190 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
231a0 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
231b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
231c0 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  ov = pSubLoop->u
231d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
231e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
231f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
23200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23210 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
23220 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
23230 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
23240 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
23250 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
23260 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
23270 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
23280 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
23290 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
232a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
232b0 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
232c0 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
232d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
232e0 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
232f0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
23300 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
23310 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
23320 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
23330 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20  b, pAndExpr);.  
23340 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
23350 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69  dbeChangeP1(v, i
23360 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33  RetInit, sqlite3
23370 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
23380 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
23390 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
233a0 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
233b0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
233c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
233d0 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70  veLabel(v, iLoop
233e0 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20  Body);..    if( 
233f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
23400 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46   ) sqlite3StackF
23410 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b  ree(db, pOrTab);
23420 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
23430 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
23440 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
23450 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
23460 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
23470 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
23480 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
23490 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72  /* Case 6:  Ther
234a0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
234b0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
234c0 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
234d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
234e0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
234f0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
23500 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
23510 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
23520 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
23530 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
23540 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
23550 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
23560 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
23570 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
23580 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70  bRev==1 );.    p
23590 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
235a0 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65  p[bRev];.    pLe
235b0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
235c0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
235d0 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
235e0 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74  AddOp2(v, aStart
235f0 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64  [bRev], iCur, ad
23600 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
23610 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
23620 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
23630 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20  CAN_STEP;.  }.  
23640 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  newNotReady = no
23650 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
23660 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
23670 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f  Set, iCur);..  /
23680 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
23690 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
236a0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
236b0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
236c0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
236d0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
236e0 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
236f0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
23700 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
23710 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
23720 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
23730 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
23740 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
23750 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
23760 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
23770 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
23780 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
23790 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
237a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
237b0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
237c0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
237d0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
237e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
237f0 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
23800 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
23810 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
23820 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
23830 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
23840 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
23850 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
23860 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
23870 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
23880 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
23890 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
238a0 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
238b0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
238c0 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
238d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
238e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
238f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23900 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
23910 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
23920 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
23930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23940 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
23950 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
23960 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
23970 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
23980 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
23990 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
239a0 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69  de to test for i
239b0 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e  mplied constrain
239c0 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e  ts based on tran
239d0 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66  sitivity.  ** of
239e0 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74   the "==" operat
239f0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  or..  **.  ** Ex
23a00 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48  ample: If the WH
23a10 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
23a20 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  ins "t1.a=t2.b" 
23a30 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20  and "t2.b=123". 
23a40 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63   ** and we are c
23a50 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f  oding the t1 loo
23a60 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f  p and the t2 loo
23a70 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f  p has not yet co
23a80 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ded,.  ** then w
23a90 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
23aa0 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e   "t1.a=t2.b" con
23ab0 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20  straint, but we 
23ac0 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68  can code.  ** th
23ad0 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d  e implied "t1.a=
23ae0 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e  123" constraint.
23af0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
23b00 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
23b10 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
23b20 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
23b30 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74  Expr *pE, *pEAlt
23b40 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
23b50 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70  *pAlt;.    if( p
23b60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23b70 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
23b80 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
23b90 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
23ba0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
23bb0 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29  (WO_EQUIV|WO_EQ)
23bc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23bd0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
23be0 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63  Cursor!=iCur ) c
23bf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23c00 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
23c10 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  in ) continue;. 
23c20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
23c30 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
23c40 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
23c50 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
23c60 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  in) );.    asser
23c70 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  t( (pTerm->prere
23c80 71 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52  qRight & newNotR
23c90 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
23ca0 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  pAlt = findTerm(
23cb0 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d  pWC, iCur, pTerm
23cc0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20  ->u.leftColumn, 
23cd0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
23ce0 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IN, 0);.    i
23cf0 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
23d00 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23d10 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
23d20 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
23d30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74  ntinue;.    test
23d40 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
23d50 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
23d60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23d70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
23d80 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64   WO_IN );.    Vd
23d90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
23da0 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74  , "begin transit
23db0 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29  ive constraint")
23dc0 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73  );.    pEAlt = s
23dd0 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
23de0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
23df0 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28  pEAlt));.    if(
23e00 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20   pEAlt ){.      
23e10 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e  *pEAlt = *pAlt->
23e20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41  pExpr;.      pEA
23e30 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  lt->pLeft = pE->
23e40 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c  pLeft;.      sql
23e50 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
23e60 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61  pParse, pEAlt, a
23e70 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
23e80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23e90 20 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46     sqlite3StackF
23ea0 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a  ree(db, pEAlt);.
23eb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23ec0 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
23ed0 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
23ee0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
23ef0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
23f00 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
23f10 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
23f20 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
23f30 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
23f40 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
23f50 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
23f60 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
23f70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
23f80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
23f90 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
23fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23fb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23fc0 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
23fd0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
23fe0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
23ff0 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
24000 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
24010 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
24020 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
24030 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
24040 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
24050 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
24060 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
24070 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
24080 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24090 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
240a0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
240b0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
240c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
240d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
240e0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
240f0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
24100 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
24110 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
24120 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d  & newNotReady)!=
24130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
24140 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
24150 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
24160 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24180 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
24190 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
241a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
241b0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
241c0 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
241d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
241e0 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
241f0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
24200 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
24210 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
24220 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24230 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a   iReleaseReg);..
24240 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52    return newNotR
24250 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  eady;.}..#ifdef 
24260 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
24270 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ED./*.** Print a
24280 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
24290 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  t for debugging 
242a0 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74  purposes.*/.stat
242b0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
242c0 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70  pPrint(WhereLoop
242d0 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54   *p, SrcList *pT
242e0 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e  abList){.  int n
242f0 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74 2d  b = 1+(pTabList-
24300 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74  >nSrc+7)/8;.  st
24310 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24320 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  m *pItem = pTabL
24330 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62  ist->a + p->iTab
24340 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
24350 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
24360 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24370 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
24380 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
24390 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
243a0 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
243b0 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
243c0 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29  , nb, p->prereq)
243d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
243e0 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
24410 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
24420 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
24430 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
24440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
24450 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
24460 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74  .    if( p->u.bt
24470 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20  ree.pIndex ){.  
24480 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
24490 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
244a0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
244b0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
244c0 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22  e==0 ) zName = "
244d0 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28 20  ipk";.      if( 
244e0 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
244f0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
24500 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
24510 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
24520 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
24530 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
24540 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
24550 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
24560 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
24570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24580 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24590 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
245a0 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
245b0 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
245c0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
245d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
245e0 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
245f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
24600 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
24610 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
24620 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
24630 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
24640 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
24660 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
24670 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
24680 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
24690 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
246a0 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
246b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
246c0 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
246d0 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
246e0 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
246f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
24700 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
24710 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
24720 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
24730 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
24740 72 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e  rintf(" f %04x N
24750 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73   %d", p->wsFlags
24760 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20  , p->nLTerm);.  
24770 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24780 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
24790 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
247a0 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
247b0 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
247c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
247d0 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
247e0 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
247f0 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
24800 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
24810 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
24820 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
24830 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
24840 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
24850 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
24860 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
24870 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
24880 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
24890 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
248a0 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
248b0 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
248c0 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
248d0 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
248e0 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
248f0 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
24900 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
24910 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
24920 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
24930 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
24940 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
24950 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
24960 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
24970 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
24980 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
24990 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
249a0 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
249b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
249c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
249d0 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
249e0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
249f0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24a00 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
24a10 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
24a20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
24a30 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
24a40 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
24a50 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
24a60 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
24a70 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24a80 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
24a90 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
24aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
24ab0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
24ac0 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
24ad0 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
24ae0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
24af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
24b00 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
24b10 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
24b20 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
24b30 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
24b40 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
24b50 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
24b60 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
24b70 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
24b80 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
24b90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24ba0 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
24bb0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
24bc0 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68  ion(db, p);.  wh
24bd0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
24be0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
24bf0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24c00 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f  ocation for pLoo
24c10 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62  p->aLTerm[] to b
24c20 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f  e at least n..*/
24c30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
24c40 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69  eLoopResize(sqli
24c50 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
24c60 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  op *p, int n){. 
24c70 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e   WhereTerm **paN
24c80 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53  ew;.  if( p->nLS
24c90 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20  lot>=n ) return 
24ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
24cb0 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e   (n+7)&~7;.  paN
24cc0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24cd0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
24ce0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
24cf0 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77  *n);.  if( paNew
24d00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
24d10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
24d20 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
24d30 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
24d40 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
24d50 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
24d60 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
24d70 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
24d80 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
24d90 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
24da0 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
24db0 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
24dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
24de0 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
24df0 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
24e00 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
24e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24e20 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
24e30 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
24e40 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
24e50 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  oop *pFrom){.  i
24e60 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
24e70 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
24e80 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65 74  m->nLTerm) ) ret
24e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
24ea0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
24eb0 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29  arUnion(db, pTo)
24ec0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  ;.  memcpy(pTo, 
24ed0 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
24ee0 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
24ef0 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
24f00 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
24f10 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
24f20 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
24f30 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
24f40 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
24f50 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
24f60 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
24f70 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
24f80 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
24f90 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
24fa0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
24fb0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
24fc0 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
24fd0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
24fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
25000 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
25010 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
25020 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
25030 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
25040 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
25050 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
25060 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
25070 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
25080 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
25090 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
250a0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
250b0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
250c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
250d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
250e0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
250f0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65  Info) ){.    whe
25100 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
25110 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
25120 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
25130 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
25140 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
25150 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
25160 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
25170 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
25180 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
25190 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
251a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
251b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
251c0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Info);.  }.}../*
251d0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
251e0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
251f0 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
25200 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
25210 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
25220 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
25230 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
25240 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
25250 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
25260 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
25270 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
25280 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
25290 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
252a0 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
252b0 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
252c0 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
252d0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
252e0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
252f0 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
25300 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
25310 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
25320 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
25330 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
25340 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
25350 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
25360 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25370 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
25380 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  en we only care 
25390 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a  about only the.*
253a0 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  * prerequisites 
253b0 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75  and rRun and nOu
253c0 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e  t costs of the N
253d0 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68   best loops.  Th
253e0 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  at.** informatio
253f0 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e  n is gathered in
25400 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70   the pBuilder->p
25410 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  OrSet object.  T
25420 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70  his special.** p
25430 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69  rocessing mode i
25440 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
25450 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
25460 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  sing..**.** When
25470 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75   accumulating mu
25480 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68  ltiple loops (wh
25490 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  en pBuilder->pOr
254a0 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a  Set is NULL) we.
254b0 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f  ** still might o
254c0 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72  verwrite similar
254d0 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20   loops with the 
254e0 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20  new template if 
254f0 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20  the.** template 
25500 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
25510 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
25520 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
25530 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
25540 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
25550 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
25560 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
25570 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
25580 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
25590 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
255a0 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
255b0 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
255c0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
255d0 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
255e0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
255f0 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
25600 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
25610 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
25620 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
25630 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68  op.**    (5)  Th
25640 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20  e template uses 
25650 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
25660 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74  e same index but
25670 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e   has no addition
25680 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  al.**         de
25690 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20  pendencies      
256a0 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69      .*/.static i
256b0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
256c0 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
256d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
256e0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
256f0 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
25700 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20  p **ppPrev, *p, 
25710 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68  *pNext = 0;.  Wh
25720 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
25730 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
25740 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
25750 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
25760 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
25770 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25780 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
25790 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
257a0 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
257b0 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
257c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
257d0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
257e0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
257f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
25800 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
25810 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
25820 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
25830 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
25840 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
25850 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
25860 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
25870 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
258a0 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
258b0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
258c0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
258d0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
258e0 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  0x8 ){.      sql
258f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25900 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
25910 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
25920 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
25930 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
25940 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
25950 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  st);.    }.#endi
25960 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
25970 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
25980 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
25990 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
259a0 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c  op to overwrite,
259b0 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a   or which takes.
259c0 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76    ** priority ov
259d0 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20  er pTemplate..  
259e0 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d  */.  for(ppPrev=
259f0 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
25a00 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70   p=*ppPrev; p; p
25a10 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
25a20 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
25a30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
25a40 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
25a50 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
25a60 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
25a70 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
25a80 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
25a90 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
25aa0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
25ab0 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
25ac0 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
25ad0 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
25ae0 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
25af0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
25b00 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
25b10 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
25b20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
25b30 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
25b40 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
25b50 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
25b60 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
25b70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
25b80 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
25b90 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
25ba0 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
25bb0 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
25bc0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
25bd0 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
25be0 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
25bf0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
25c00 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
25c10 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
25c20 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
25c30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
25c40 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
25c50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
25c60 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
25c70 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
25c80 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
25c90 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
25ca0 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
25cb0 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
25cc0 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
25cd0 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
25ce0 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
25cf0 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
25d00 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
25d10 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
25d20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
25d30 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
25d40 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
25d50 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
25d60 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
25d70 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  ..    if( (p->pr
25d80 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
25d90 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
25da0 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
25db0 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74  rSetup<=pTemplat
25dc0 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26  e->rSetup.     &
25dd0 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
25de0 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29  late->rRun.    )
25df0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
25e00 62 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68 65  branch taken whe
25e10 6e 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72 20  n p is equal or 
25e20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d  better than pTem
25e30 70 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20 20  plate in .      
25e40 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64 65  ** all of (1) de
25e50 70 65 6e 64 65 6e 63 65 73 20 28 32 29 20 73 65  pendences (2) se
25e60 74 75 70 2d 63 6f 73 74 2c 20 61 6e 64 20 28 33  tup-cost, and (3
25e70 29 20 72 75 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20  ) run-cost. */. 
25e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
25e90 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
25ea0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20  e->rSetup );.   
25eb0 20 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d     if( p->nLTerm
25ec0 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65  <pTemplate->nLTe
25ed0 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d  rm.       && (p-
25ee0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25ef0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
25f00 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
25f10 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
25f20 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
25f30 20 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74        && p->u.bt
25f40 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d  ree.pIndex==pTem
25f50 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70  plate->u.btree.p
25f60 49 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26 20  Index.       && 
25f70 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70  p->prereq==pTemp
25f80 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
25f90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
25fa0 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
25fb0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
25fc0 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72   with an similar
25fd0 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20   one that uses. 
25fe0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74         ** more t
25ff0 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
26000 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  x */.        pNe
26010 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  xt = p->pNextLoo
26020 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
26030 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26040 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c         /* pTempl
26050 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66  ate is not helpf
26060 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52  ul..        ** R
26070 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68  eturn without ch
26080 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67  anging or adding
26090 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20   anything */.   
260a0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
260b0 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a  oopInsert_noop;.
260c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
260d0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
260e0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
260f0 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
26100 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
26110 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
26120 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26  ate->rRun.     &
26130 26 20 41 4c 57 41 59 53 28 70 2d 3e 72 53 65 74  & ALWAYS(p->rSet
26140 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
26150 53 65 74 75 70 29 20 2f 2a 20 53 65 65 20 53 45  Setup) /* See SE
26160 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
26170 6f 76 65 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  ove */.    ){.  
26180 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
26190 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
261a0 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65  reLoop with a be
261b0 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68  tter one: one th
261c0 61 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 62  at is.      ** b
261d0 65 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66 20  etter at one of 
261e0 28 31 29 20 64 65 70 65 6e 64 65 6e 63 65 73 2c  (1) dependences,
261f0 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c   (2) setup-cost,
26200 20 6f 72 20 28 33 29 20 72 75 6e 2d 63 6f 73 74   or (3) run-cost
26210 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 69 73  .      ** and is
26220 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79   no worse in any
26230 20 6f 66 20 74 68 6f 73 65 20 63 61 74 65 67 6f   of those catego
26240 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ries. */.      p
26250 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
26260 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  oop;.      break
26270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26280 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
26290 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
262a0 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
262b0 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
262c0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
262d0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
262e0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
262f0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
26300 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
26310 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
26320 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
26330 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
26340 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
26350 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
26360 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66   & 0x8 ){.    if
26370 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p!=0 ){.      
26380 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26390 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29  tf("ins-del:  ")
263a0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
263b0 70 50 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f  pPrint(p, pWInfo
263c0 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  ->pTabList);.   
263d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
263e0 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
263f0 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65  ew:  ");.    whe
26400 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
26410 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  plate, pWInfo->p
26420 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65  TabList);.  }.#e
26430 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
26440 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
26450 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
26460 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
26470 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
26480 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
26490 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
264a0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
264b0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
264c0 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
264d0 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  late);.  p->pNex
264e0 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20  tLoop = pNext;. 
264f0 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20   *ppPrev = p;.  
26500 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
26510 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26520 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
26530 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
26540 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26550 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
26560 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
26570 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
26580 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26590 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
265a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
265b0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
265c0 72 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74  re if the insert
265d0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77   is a no-op */.w
265e0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
265f0 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52  oop:.#if WHERETR
26600 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
26610 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26620 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
26630 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26640 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  ntf("ins-noop: "
26650 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
26660 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
26670 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26680 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
26690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
266a0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  K;  .}../*.** We
266b0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
266c0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
266d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
266e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
266f0 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54  dex pIndex..** T
26700 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
26710 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  more..**.** If p
26720 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
26730 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
26740 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
26750 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
26760 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
26770 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
26780 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
26790 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
267a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
267b0 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
267c0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
267d0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
267e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
267f0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
26800 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26810 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
26820 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
26830 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
26840 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
26850 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68   on pSrc */.  Wh
26860 65 72 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20  ereCost nInMul  
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26880 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
26890 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
268a0 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
268b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
268c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
268d0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
268e0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
268f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
26900 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
26910 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
26920 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26930 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26940 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
26950 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
26960 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
26970 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26980 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
26990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
269a0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
269b0 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
269c0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
269d0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
269e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
269f0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
26a00 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
26a10 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
26a40 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
26a50 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
26a60 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
26a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
26a80 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
26a90 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
26aa0 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
26ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26ac0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26ad0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
26ae0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
26af0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26b00 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26b10 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
26b20 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  erm */.  int sav
26b30 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
26b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
26b50 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
26b60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
26b70 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
26b80 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
26b90 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
26ba0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
26bb0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65  wsFlags */.  Whe
26bc0 72 65 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75  reCost saved_nOu
26bd0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
26be0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26bf0 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
26c00 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
26c30 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
26c40 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
26c50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26c70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57  turn code */.  W
26c80 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74  hereCost nRowEst
26c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26ca0 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65  * Estimated inde
26cb0 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f  x selectivity */
26cc0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f  .  WhereCost rLo
26cd0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
26ce0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
26cf0 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
26d00 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
26d10 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
26d20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
26d30 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
26d40 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
26d50 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
26d60 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
26d70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
26d80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26d90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
26da0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26db0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
26dc0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
26dd0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
26de0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
26df0 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
26e00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
26e10 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
26e20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
26e30 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
26e40 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
26e50 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
26e60 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
26e70 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
26e80 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
26e90 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
26ea0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
26eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
26ec0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
26ed0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
26ee0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
26ef0 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
26f00 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
26f10 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
26f20 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
26f30 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
26f40 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
26f50 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
26f60 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20  Column );.  if( 
26f70 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26f80 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  q < pProbe->nCol
26f90 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  umn ){.    iCol 
26fa0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
26fb0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
26fc0 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45  .nEq];.    nRowE
26fd0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  st = whereCost(p
26fe0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
26ff0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27000 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  q+1]);.    if( n
27010 52 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72  RowEst==0 && pPr
27020 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  obe->onError==OE
27030 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20  _None ) nRowEst 
27040 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
27050 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20    iCol = -1;.   
27060 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20   nRowEst = 0;.  
27070 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  }.  pTerm = wher
27080 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
27090 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
270a0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69  pSrc->iCursor, i
270b0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
270d0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
270e0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
270f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
27100 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
27110 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
27120 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
27130 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
27140 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
27150 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
27160 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
27170 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  w->nOut;.  pNew-
27180 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
27190 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
271a0 28 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62  (whereCost(pProb
271b0 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29  e->aiRowEst[0]))
271c0 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  ;.  for(; rc==SQ
271d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
271e0 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
271f0 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
27200 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
27210 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
27220 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
27230 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
27240 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
27250 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 69 6e 74  ecValid;.    int
27260 20 6e 4d 61 78 52 6f 77 63 6e 74 20 3d 20 70 42   nMaxRowcnt = pB
27270 75 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63  uilder->nMaxRowc
27280 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  nt;.    if( (pTe
27290 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
272a0 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 20 26 26 20  RM_VNULL)!=0 && 
272b0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
272c0 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
272d0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
272e0 3b 20 2f 2a 20 73 6b 69 70 20 49 53 20 4e 4f 54  ; /* skip IS NOT
272f0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
27300 73 20 6f 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  s on a NOT NULL 
27310 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d 0a  column */.    }.
27320 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
27330 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27340 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
27350 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  lf ) continue;..
27360 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27370 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
27380 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
27390 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
273a0 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
273b0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
273c0 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
273d0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
273e0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
273f0 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
27400 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
27410 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
27420 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
27430 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
27440 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
27450 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
27460 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
27470 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
27480 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
27490 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61   rLogSize; /* Ba
274a0 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c  seline cost is l
274b0 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d  og2(N).  Adjustm
274c0 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ents below */.  
274d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
274e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
274f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
27500 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
27510 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
27520 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27530 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
27540 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
27550 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
27560 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
27570 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
27580 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
27590 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
275a0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
275b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
275c0 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
275d0 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
275e0 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
275f0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
27600 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
27610 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
27620 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27630 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
27640 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
27650 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 77  .        nIn = w
27660 68 65 72 65 43 6f 73 74 28 70 45 78 70 72 2d 3e  hereCost(pExpr->
27670 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  x.pList->nExpr);
27680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
27690 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e  New->rRun += nIn
276a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
276b0 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
276c0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
276d0 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
276e0 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   + nIn;.    }els
276f0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
27700 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29  erator & (WO_EQ)
27710 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27720 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27730 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
27740 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55  _NULL|WHERE_COLU
27750 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20  MN_IN))!=0.     
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
27770 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20  nInMul==0 );.   
27780 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27790 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
277a0 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69  _EQ;.      if( i
277b0 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c  Col<0  .       |
277c0 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  | (pProbe->onErr
277d0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e  or!=OE_None && n
277e0 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
277f0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
27800 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65  tree.nEq==pProbe
27810 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20  ->nColumn-1).   
27820 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73     ){.        as
27830 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
27840 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
27850 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43  UMN_IN)==0 || iC
27860 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol<0 );.        
27870 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27880 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
27890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
278a0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
278b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
278c0 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e  ut = nRowEst + n
278d0 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  InMul;.    }else
278e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
278f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
27900 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  LL) ){.      pNe
27910 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27920 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
27930 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
27940 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
27950 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20    /* TUNING: IS 
27960 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72  NULL selects 2 r
27970 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e  ows */.      nIn
27980 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20   = 10;  assert( 
27990 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 29  10==whereCost(2)
279a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
279b0 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
279c0 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
279d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
279e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
279f0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
27a00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27a10 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27a20 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20  r & WO_GT );.   
27a30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
27a40 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27a50 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
27a60 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27a70 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
27a80 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
27a90 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
27aa0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
27ab0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
27ac0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
27ad0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27ae0 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
27af0 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
27b00 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
27b10 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b  rator & WO_LT );
27b20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27b30 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27b40 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
27b50 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27b60 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
27b70 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
27b80 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
27b90 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
27ba0 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
27bb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27bc0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
27bf0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
27c00 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] : 0;.    }.   
27c10 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
27c20 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
27c30 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
27c40 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20   /* Adjust nOut 
27c50 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41  and rRun for STA
27c60 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20  T3 range values 
27c70 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f  */.      WhereCo
27c80 73 74 20 72 44 69 76 3b 0a 20 20 20 20 20 20 77  st rDiv;.      w
27c90 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
27ca0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
27cb0 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26  r, pBtm, pTop, &
27cc0 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65  rDiv);.      pNe
27cd0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
27ce0 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73  nOut>rDiv+10 ? s
27cf0 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76  aved_nOut - rDiv
27d00 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66   : 10;.    }.#if
27d10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27d20 45 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28 20  E_STAT4.    if( 
27d30 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 50 72  nInMul==0 && pPr
27d40 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20  obe->nSample && 
27d50 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
27d60 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
27d70 74 61 74 33 29 20 29 7b 0a 20 20 20 20 20 20 45  tat3) ){.      E
27d80 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
27d90 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
27da0 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
27db0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
27dc0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27dd0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
27de0 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
27df0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27e00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27e10 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
27e20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
27e30 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
27e40 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
27e50 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
27e60 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
27e70 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
27e80 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
27e90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27ea0 28 20 6e 4f 75 74 3d 3d 30 7c 7c 70 42 75 69 6c  ( nOut==0||pBuil
27eb0 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 3d  der->nMaxRowcnt=
27ec0 3d 30 7c 7c 6e 4f 75 74 3c 3d 70 42 75 69 6c 64  =0||nOut<=pBuild
27ed0 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 29 3b  er->nMaxRowcnt);
27ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75  .        if( nOu
27ef0 74 20 29 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d  t ) pBuilder->nM
27f00 61 78 52 6f 77 63 6e 74 20 3d 20 6e 4f 75 74 3b  axRowcnt = nOut;
27f10 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27f20 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
27f30 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20  or & WO_IN).    
27f40 20 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78           &&  !Ex
27f50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
27f60 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
27f70 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t)  ){.        r
27f80 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
27f90 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
27fa0 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
27fb0 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
27fc0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
27fd0 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63  t( nOut==0 || rc
27fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
27ff0 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 20       if( nOut ) 
28000 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65  pNew->nOut = whe
28010 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20  reCost(nOut);.  
28020 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
28030 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28040 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28050 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28060 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 ){.      /* E
28070 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73  ach row involves
28080 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69   a step of the i
28090 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e  ndex, then a bin
280a0 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20  ary search of.  
280b0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20      ** the main 
280c0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
280d0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65  New->rRun =  whe
280e0 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
280f0 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32  rRun, rLogSize>2
28100 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
28110 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
28120 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
28130 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
28140 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
28150 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
28160 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
28170 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
28180 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
28190 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Out for addition
281a0 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  al constraints *
281b0 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  /.    rc = where
281c0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
281d0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
281e0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
281f0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28200 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
28210 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28220 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<(pProbe->nCol
28230 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  umn + (pProbe->z
28240 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
28250 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28260 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
28270 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
28280 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
28290 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
282a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
282b0 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
282c0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
282d0 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 70 42 75  ecValid;.    pBu
282e0 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e  ilder->nMaxRowcn
282f0 74 20 3d 20 6e 4d 61 78 52 6f 77 63 6e 74 3b 0a  t = nMaxRowcnt;.
28300 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
28310 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
28320 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
28330 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
28340 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
28350 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
28360 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
28370 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
28380 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
28390 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
283a0 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72  Term;.  return r
283b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
283c0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
283d0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
283e0 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
283f0 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
28400 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
28410 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
28420 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
28430 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
28440 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
28450 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
28460 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
28470 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
28480 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
28490 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
284a0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
284b0 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
284c0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
284d0 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
284e0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
284f0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
28500 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
28510 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
28520 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
28530 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
28540 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
28550 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
28560 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
28570 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
28580 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
28590 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
285a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
285b0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
285c0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
285d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
285e0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
285f0 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
28600 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
28610 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
28620 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
28630 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
28640 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
28650 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  or ){.      for(
28660 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
28670 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b 29 7b  >nColumn; jj++){
28680 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
28690 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
286a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
286b0 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
286c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
286d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
286e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
286f0 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
28700 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
28710 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
28720 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
28730 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
28740 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
28750 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
28760 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
28770 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
28780 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
28790 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
287a0 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
287b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
287c0 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
287d0 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
287e0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
287f0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
28800 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
28810 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
28820 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
28830 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78  S-2 );.    if( x
28840 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
28850 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20  SKBIT(x);.  }.  
28860 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20  return m;.}../* 
28870 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28880 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
28890 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57  with pPartIndexW
288a0 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  here can be used
288b0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
288c0 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  nt query.  Retur
288d0 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e  n true if it can
288e0 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66   be and false if
288f0 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
28900 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50  int whereUsableP
28910 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20  artialIndex(int 
28920 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73  iTab, WhereClaus
28930 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57  e *pWC, Expr *pW
28940 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  here){.  int i;.
28950 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28960 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rm;.  for(i=0, p
28970 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
28980 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
28990 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
289a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
289b0 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e  liesExpr(pTerm->
289c0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
289d0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
289e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
289f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
28a00 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
28a10 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  cts for a single
28a20 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
28a30 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62  in where the tab
28a40 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
28a50 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
28a60 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
28a70 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
28a80 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
28a90 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
28aa0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
28ab0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
28ac0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
28ad0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
28ae0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
28af0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
28b00 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
28b10 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
28b20 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a              /
28b30 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
28b40 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
28b50 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
28b60 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
28b70 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
28b80 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
28b90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
28ba0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
28bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
28bc0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
28bd0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
28be0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
28bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
28c00 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
28c10 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
28c20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
28c30 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
28c40 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
28c50 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
28c60 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
28c70 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
28c80 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
28c90 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
28ca0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
28cb0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
28cc0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
28cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28ce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
28cf0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28d00 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
28d10 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
28d20 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
28d30 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
28d40 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
28d50 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
28d60 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
28d70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
28d80 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28d90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28da0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
28db0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
28dc0 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
28dd0 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
28e00 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65  value */.  Where
28e10 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  Cost rSize;     
28e20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
28e30 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
28e40 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
28e50 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  Cost rLogSize;  
28e60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
28e70 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
28e80 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
28e90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
28ea0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
28eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28ec0 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
28ed0 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  se */.  .  pNew 
28ee0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
28ef0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
28f00 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
28f10 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
28f20 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
28f30 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
28f40 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
28f50 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
28f60 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
28f70 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
28f80 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
28f90 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
28fa0 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
28fb0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
28fc0 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
28fd0 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
28fe0 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
28ff0 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
29000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29010 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
29020 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
29030 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
29040 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
29050 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
29060 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
29070 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
29080 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
29090 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
290a0 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
290b0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
290c0 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
290d0 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
290e0 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
290f0 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
29100 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
29110 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
29120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29130 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
29140 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
29150 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
29160 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
29170 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
29180 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
29190 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
291a0 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
291b0 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20   sPk.aiRowEst = 
291c0 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20  aiRowEstPk;.    
291d0 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  sPk.onError = OE
291e0 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50  _Replace;.    sP
291f0 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d  k.pTable = pSrc-
29200 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77  >pTab;.    aiRow
29210 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d  EstPk[0] = pSrc-
29220 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a  >pTab->nRowEst;.
29230 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
29240 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73  ] = 1;.    pFirs
29250 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
29260 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
29270 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
29280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
29290 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
292a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
292b0 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
292c0 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
292d0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
292e0 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
292f0 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
29300 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
29310 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
29320 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
29330 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
29340 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72  }.  rSize = wher
29350 65 43 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62  eCost(pSrc->pTab
29360 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c  ->nRowEst);.  rL
29370 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
29380 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75  rSize);..  /* Au
29390 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
293a0 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64  */.  if( !pBuild
293b0 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26  er->pOrSet.   &&
293c0 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
293d0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
293e0 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
293f0 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
29400 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
29410 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
29420 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
29430 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
29440 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
29450 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ated.  ){.    /*
29460 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
29470 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
29480 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
29490 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
294a0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
294b0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
294c0 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
294d0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
294e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
294f0 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
29500 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
29510 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
29520 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
29530 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
29540 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
29550 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
29560 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
29570 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
29580 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
29590 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
295a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
295b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
295c0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
295d0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
295e0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
295f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
29600 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
29610 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
29620 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
29630 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f          ** appro
29640 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67  ximately 7*N*log
29650 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
29660 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
29670 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
29680 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
29690 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20   indexed. */.   
296a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
296b0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
296c0 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65  Size + 28;  asse
296d0 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43 6f 73  rt( 28==whereCos
296e0 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(7) );.        
296f0 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
29700 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
29710 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
29720 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
29730 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
29740 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
29750 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
29760 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
29770 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
29780 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20   ** of knowning 
29790 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
297a0 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
297b0 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
297c0 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
297d0 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
297e0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
297f0 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
29800 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
29810 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
29820 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 77 68    assert( 43==wh
29830 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b 0a 20  ereCost(20) );. 
29840 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
29850 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  n = whereCostAdd
29860 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
29870 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
29880 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
29890 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
298a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
298b0 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c  rereq = mExtra |
298c0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
298d0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
298e0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
298f0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29910 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
29920 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
29930 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
29940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29950 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
29960 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
29970 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
29980 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
29990 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
299a0 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
299b0 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77  artialIndex(pNew
299c0 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72  ->iTab, pWC, pPr
299d0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
299e0 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  re) ){.      con
299f0 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
29a00 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
29a10 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
29a20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
29a30 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
29a40 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
29a50 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
29a60 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
29a70 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
29a80 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
29a90 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
29aa0 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
29ab0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
29ac0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
29ad0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
29ae0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
29af0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
29b00 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
29b10 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
29b20 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
29b30 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
29b40 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
29b50 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
29b60 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
29b70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
29b80 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
29b90 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
29ba0 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
29bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
29bc0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
29bd0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
29be0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
29bf0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
29c00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29c10 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
29c20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
29c30 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
29c40 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
29c50 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
29c60 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
29c70 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
29c80 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20  le scan is 3*(N 
29c90 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20  + log2(N))..    
29ca0 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
29cb0 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74  ra 3 factor is t
29cc0 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
29cd0 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c  use of indexed l
29ce0 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20  ookups.      ** 
29cf0 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63      over full sc
29d00 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65 72 20  ans.  A smaller 
29d10 63 6f 6e 73 74 61 6e 74 20 32 20 69 73 20 75 73  constant 2 is us
29d20 65 64 20 66 6f 72 20 63 6f 76 65 72 69 6e 67 0a  ed for covering.
29d30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
29d40 65 78 20 73 63 61 6e 73 20 73 6f 20 74 68 61 74  ex scans so that
29d50 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
29d60 78 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 66  x scan will be f
29d70 61 76 6f 72 65 64 20 6f 76 65 72 0a 20 20 20 20  avored over.    
29d80 20 20 2a 2a 20 20 20 20 20 61 20 74 61 62 6c 65    **     a table
29d90 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20   scan. */.      
29da0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
29db0 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c  reCostAdd(rSize,
29dc0 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a  rLogSize) + 16;.
29dd0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29de0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
29df0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
29e00 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
29e10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29e20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
29e30 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
29e40 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
29e50 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 70 4e  Probe);.      pN
29e60 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
29e70 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
29e80 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
29e90 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
29ea0 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a  DEXED;..      /*
29eb0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
29ec0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
29ed0 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ( b.       || ( 
29ee0 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
29ef0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
29f00 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
29f10 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
29f20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
29f30 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
29f40 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
29f50 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
29f60 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
29f70 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
29f80 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
29f90 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
29fa0 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
29fb0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
29fc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29fd0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
29fe0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
29ff0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
2a000 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
2a010 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2a020 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20  t of a covering 
2a030 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 32 2a  index scan is 2*
2a040 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
2a050 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20           **  +  
2a060 54 68 65 20 65 78 74 72 61 20 32 20 66 61 63 74  The extra 2 fact
2a070 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61  or is to encoura
2a080 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ge the use of in
2a090 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20  dexed lookups.  
2a0a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f          **     o
2a0b0 76 65 72 20 69 6e 64 65 78 20 73 63 61 6e 73 2e  ver index scans.
2a0c0 20 20 41 20 74 61 62 6c 65 20 73 63 61 6e 20 75    A table scan u
2a0d0 73 65 73 20 61 20 66 61 63 74 6f 72 20 6f 66 20  ses a factor of 
2a0e0 33 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  3 so that.      
2a0f0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
2a100 20 73 63 61 6e 73 20 61 72 65 20 66 61 76 6f 72   scans are favor
2a110 65 64 20 6f 76 65 72 20 74 61 62 6c 65 20 73 63  ed over table sc
2a120 61 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ans..          *
2a130 2a 20 20 2b 20 20 49 66 20 74 68 69 73 20 63 6f  *  +  If this co
2a140 76 65 72 69 6e 67 20 69 6e 64 65 78 20 6d 69 67  vering index mig
2a150 68 74 20 61 6c 73 6f 20 68 65 6c 70 20 73 61 74  ht also help sat
2a160 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
2a170 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  Y.          **  
2a180 20 20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20     clause, then 
2a190 74 68 65 20 63 6f 73 74 20 69 73 20 66 75 64 67  the cost is fudg
2a1a0 65 64 20 64 6f 77 6e 20 73 6c 69 67 68 74 6c 79  ed down slightly
2a1b0 20 73 6f 20 74 68 61 74 20 74 68 69 73 0a 20 20   so that this.  
2a1c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2a1d0 6e 64 65 78 20 69 73 20 66 61 76 6f 72 65 64 20  ndex is favored 
2a1e0 61 62 6f 76 65 20 6f 74 68 65 72 20 69 6e 64 69  above other indi
2a1f0 63 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  ces that have no
2a200 20 68 6f 70 65 20 6f 66 0a 20 20 20 20 20 20 20   hope of.       
2a210 20 20 20 2a 2a 20 20 20 20 20 68 65 6c 70 69 6e     **     helpin
2a220 67 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  g with the ORDER
2a230 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   BY. */.        
2a240 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 31    pNew->rRun = 1
2a250 30 20 2b 20 77 68 65 72 65 43 6f 73 74 41 64 64  0 + whereCostAdd
2a260 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
2a270 20 2d 20 62 3b 0a 20 20 20 20 20 20 20 20 7d 65   - b;.        }e
2a280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2a290 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a  ssert( b!=0 ); .
2a2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
2a2b0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61  ING: Cost of sca
2a2c0 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65  nning a non-cove
2a2d0 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e  ring index is (N
2a2e0 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20  +1)*log2(N).    
2a2f0 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77        ** which w
2a300 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20  e will simplify 
2a310 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e  to just N*log2(N
2a320 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  ) */.          p
2a330 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
2a340 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20  e + rLogSize;.  
2a350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a360 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2a370 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2a380 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
2a390 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2a3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
2a3b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2a3c0 45 5f 53 54 41 54 34 0a 20 20 20 20 61 73 73 65  E_STAT4.    asse
2a3d0 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  rt( pBuilder->pR
2a3e0 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ec==0 );.    rc 
2a3f0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
2a400 6f 62 65 4e 65 77 28 70 57 49 6e 66 6f 2d 3e 70  obeNew(pWInfo->p
2a410 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 26  Parse, pProbe, &
2a420 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
2a430 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a440 49 54 45 5f 4f 4b 20 29 7b 0a 23 65 6e 64 69 66  ITE_OK ){.#endif
2a450 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2a460 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
2a470 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
2a480 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
2a490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2a4a0 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 20 20  BLE_STAT4.      
2a4b0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
2a4c0 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
2a4d0 70 52 65 63 29 3b 0a 20 20 20 20 20 20 70 42 75  pRec);.      pBu
2a4e0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
2a4f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 42 75 69   = 0;.      pBui
2a500 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
2a510 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2a520 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  ( pBuilder->pRec
2a530 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
2a540 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2a550 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2a560 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2a570 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2a580 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2a590 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2a5a0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2a5b0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2a5c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2a5d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a5e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2a5f0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2a600 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2a610 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2a620 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2a630 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2a640 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2a650 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2a660 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2a670 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2a680 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2a690 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2a6a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2a6b0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2a6c0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2a6d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2a6e0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2a6f0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2a700 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2a710 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2a720 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a740 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2a750 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2a760 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2a770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2a780 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2a790 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2a7a0 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2a7b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2a7c0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2a7d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2a7e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2a7f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2a800 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2a810 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2a820 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2a830 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2a840 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2a850 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2a860 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2a870 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2a880 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2a890 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2a8a0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2a8b0 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2a8c0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2a8d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2a8e0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2a8f0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2a900 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2a910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a920 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2a930 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2a940 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2a950 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2a960 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2a970 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2a980 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2a990 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2a9a0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2a9b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a9c0 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2a9d0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2a9e0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2a9f0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2aa00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2aa10 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2aa20 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2aa30 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2aa40 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2aa50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2aa60 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2aa70 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2aa80 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2aa90 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2aaa0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2aab0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2aac0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2aad0 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2aae0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2aaf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2ab00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2ab10 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2ab20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2ab30 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2ab40 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2ab50 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2ab60 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2ab70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2ab80 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2ab90 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2aba0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2abb0 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2abc0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2abd0 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2abe0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2abf0 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2ac00 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
2ac10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2ac20 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
2ac30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2ac40 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
2ac50 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
2ac60 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
2ac70 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
2ac80 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
2ac90 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
2aca0 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
2acb0 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
2acc0 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
2acd0 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
2ace0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
2acf0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2ad00 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2ad10 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2ad20 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2ad30 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
2ad40 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
2ad50 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2ad60 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2ad70 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2ad80 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2ad90 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2ada0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
2adb0 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
2adc0 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2add0 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2ade0 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
2adf0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
2ae00 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2ae10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ae20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2ae30 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2ae40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ae50 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
2ae60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ae70 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2ae80 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2aea0 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2aeb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
2aec0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2aed0 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
2aee0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2aef0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2af00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2af10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2af20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
2af30 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2af40 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
2af50 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2af60 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
2af70 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2af80 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2af90 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
2afa0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
2afb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2afc0 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
2afd0 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
2afe0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2aff0 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
2b000 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2b010 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2b020 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b030 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
2b040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b050 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2b060 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2b070 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
2b080 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2b090 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
2b0a0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b0b0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2b0c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b0e0 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
2b0f0 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
2b100 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
2b110 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2b120 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2b130 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2b140 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2b150 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2b160 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
2b170 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
2b180 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2b190 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
2b1a0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2b1b0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2b1c0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b1d0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2b1e0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2b1f0 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
2b200 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
2b210 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d  uble)2;.    rc =
2b220 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2b230 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2b240 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2b250 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2b260 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2b270 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2b280 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2b290 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2b2a0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2b2b0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2b2c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2b2d0 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2b2e0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2b2f0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2b300 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2b310 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2b320 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2b330 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2b340 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2b350 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2b360 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b370 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2b380 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2b390 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2b3a0 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2b3b0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2b3c0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2b3d0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2b3e0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2b3f0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2b400 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2b410 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2b420 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2b430 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2b440 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2b450 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b470 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2b480 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b490 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2b4a0 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2b4b0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2b4c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2b4d0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2b4e0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2b4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2b500 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2b510 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2b520 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2b530 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2b540 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2b550 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2b560 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2b570 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2b580 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2b590 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2b5a0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2b5b0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2b5c0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2b5d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2b5e0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2b5f0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2b600 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2b610 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2b620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b630 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2b640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2b650 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2b660 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2b670 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2b680 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2b690 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2b6a0 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2b6b0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2b6c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2b6d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2b6e0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2b6f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2b700 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2b710 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2b720 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2b730 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2b740 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2b750 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2b760 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2b770 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2b780 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2b790 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2b7a0 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2b7b0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2b7c0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2b7d0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2b7f0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2b800 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2b810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b830 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2b840 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2b850 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2b860 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2b870 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2b880 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2b890 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2b8a0 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2b8b0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2b8c0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2b8d0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2b8e0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2b8f0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2b900 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2b910 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2b920 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2b930 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2b940 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2b950 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2b960 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2b970 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2b980 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2b990 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b9a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b9b0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2b9c0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2b9d0 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2b9e0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2b9f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2ba00 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2ba10 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2ba20 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2ba30 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2ba40 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2ba50 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2ba60 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2ba70 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2ba80 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2ba90 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2baa0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2bab0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2bac0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2bad0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2bae0 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
2baf0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
2bb00 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=0).         
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2bb30 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2bb40 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
2bb50 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2bb60 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2bb70 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46  Run = whereCostF
2bb80 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2bb90 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2bba0 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  t);.      /* TUN
2bbb0 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75  ING: Every virtu
2bbc0 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72  al table query r
2bbd0 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2bbe0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  /.      pNew->nO
2bbf0 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  ut = 46;  assert
2bc00 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
2bc10 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2bc20 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2bc30 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2bc40 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2bc50 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2bc60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bc70 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2bc80 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2bc90 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2bca0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2bcb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bcc0 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2bcd0 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2bce0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2bcf0 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2bd00 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2bd10 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2bd20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2bd30 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2bd40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2bd50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bd60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2bd70 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2bd80 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2bd90 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2bda0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2bdb0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2bdc0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2bdd0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2bde0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2bdf0 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2be00 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2be10 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2be20 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2be30 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2be40 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2be50 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2be60 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2be70 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2be80 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2be90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bea0 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2beb0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2bec0 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2bed0 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2bee0 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2bef0 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
2bf00 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
2bf10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2bf20 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2bf30 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2bf40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2bf50 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2bf60 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2bf70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2bf80 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2bf90 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2bfa0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2bfb0 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
2bfc0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
2bfd0 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
2bfe0 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
2bff0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2c000 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
2c010 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
2c020 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
2c030 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
2c040 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
2c050 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
2c060 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
2c070 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
2c080 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
2c090 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2c0a0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
2c0b0 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
2c0c0 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
2c0d0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2c0e0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
2c0f0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
2c100 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
2c110 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57        pItem = pW
2c120 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2c130 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2c140 20 20 20 20 20 20 69 43 75 72 20 3d 20 70 49 74        iCur = pIt
2c150 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2c160 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
2c170 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
2c180 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
2c190 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
2c1a0 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
2c1b0 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66   &sCur;..      f
2c1c0 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
2c1d0 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
2c1e0 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
2c1f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2c200 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2c210 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2c220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2c230 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
2c240 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
2c250 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
2c260 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
2c270 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
2c280 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
2c290 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
2c2a0 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
2c2b0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
2c2c0 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
2c2d0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
2c2e0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
2c2f0 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
2c300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c310 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
2c320 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
2c330 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
2c340 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
2c350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c370 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
2c380 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  .n = 0;.#ifndef 
2c390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c3a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
2c3b0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2c3c0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2c3d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2c3e0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2c3f0 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20  l(&sSubBuild);. 
2c400 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2c410 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29  ; i<sCur.n; i++)
2c420 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65   sCur.a[i].prere
2c430 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  q |= mExtra;.   
2c440 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2c450 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
2c460 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c470 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
2c480 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
2c490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c4a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2c4b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
2c4c0 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
2c4d0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
2c4e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2c4f0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2c500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c510 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
2c520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2c530 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
2c540 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
2c550 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
2c560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c570 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2c580 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
2c590 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
2c5a0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2c5b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
2c5c0 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
2c5d0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2c5e0 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
2c5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
2c600 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
2c610 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
2c620 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
2c630 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c650 20 20 20 20 20 20 77 68 65 72 65 43 6f 73 74 41        whereCostA
2c660 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
2c670 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
2c680 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 73 50   whereCostAdd(sP
2c6b0 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
2c6c0 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
2c6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c700 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2c710 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
2c720 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2c730 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
2c740 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2c750 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
2c760 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2c770 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
2c780 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2c790 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
2c7a0 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
2c7b0 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
2c7c0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
2c7d0 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
2c7e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c7f0 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69  /* TUNING: Multi
2c800 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72 20 74  ple by 3.5 for t
2c810 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74 61 62  he secondary tab
2c820 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20  le lookup */.   
2c830 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2c840 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  = sSum.a[i].rRun
2c850 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20 20 70   + 18;.        p
2c860 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
2c870 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
2c880 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2c890 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
2c8a0 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
2c8b0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2c8c0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2c8d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2c900 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2c910 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
2c920 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
2c930 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
2c940 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
2c950 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
2c960 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2c970 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2c980 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
2c990 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
2c9a0 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
2c9b0 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
2c9c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2c9d0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2c9e0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2c9f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ca00 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
2ca10 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2ca20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
2ca30 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  nTabList = pWInf
2ca40 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  o->nLevel;.  int
2ca50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ca60 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54  .  u8 priorJoinT
2ca70 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ype = 0;.  Where
2ca80 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f  Loop *pNew;..  /
2ca90 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
2caa0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
2cab0 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
2cac0 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
2cad0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2cae0 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
2caf0 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
2cb00 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
2cb10 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c  abList->a; iTab<
2cb20 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b  nTabList; iTab++
2cb30 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2cb40 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
2cb50 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
2cb60 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
2cb70 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2cb80 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
2cb90 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
2cba0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72  tem->jointype|pr
2cbb0 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28  iorJoinType) & (
2cbc0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2cbd0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ))!=0 ){.      m
2cbe0 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
2cbf0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
2cc00 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d  oinType = pItem-
2cc10 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  >jointype;.    i
2cc20 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2cc30 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2cc40 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2cc50 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
2cc60 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lder);.    }else
2cc70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2cc80 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
2cc90 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
2cca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ccb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ccc0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2ccd0 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
2cce0 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2ccf0 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
2cd00 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
2cd10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
2cd20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cd30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2cd40 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
2cd50 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
2cd60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cd70 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
2cd80 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
2cd90 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
2cda0 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
2cdb0 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
2cdc0 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
2cdd0 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
2cde0 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
2cdf0 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
2ce00 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
2ce10 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
2ce20 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
2ce30 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
2ce40 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20  n:.** .**    0: 
2ce50 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74   ORDER BY is not
2ce60 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72   satisfied.  Sor
2ce70 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a  ting required.**
2ce80 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59      1:  ORDER BY
2ce90 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20   is satisfied.  
2cea0 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67      Omit sorting
2ceb0 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f  .**   -1:  Unkno
2cec0 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a  wn at this time.
2ced0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2cee0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
2cef0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
2cf00 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2cf10 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
2cf20 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
2cf30 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2cf40 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
2cf50 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
2cf60 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
2cf70 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
2cf80 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
2cf90 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
2cfa0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
2cfb0 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72  DISTINT do not r
2cfc0 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
2cfd0 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
2cfe0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
2cff0 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
2d000 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  velent rows are 
2d010 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2d020 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
2d030 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2d040 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
2d050 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
2d060 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
2d070 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
2d080 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
2d090 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
2d0a0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
2d0b0 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
2d0c0 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
2d0d0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2d0e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2d0f0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
2d100 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
2d110 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d120 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2d130 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
2d140 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
2d150 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
2d160 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
2d170 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2d180 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
2d190 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
2d1a0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
2d1b0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2d1c0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
2d1d0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
2d1e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2d1f0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
2d200 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d210 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2d220 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
2d230 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
2d240 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
2d250 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
2d260 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
2d270 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
2d280 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
2d290 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
2d2a0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
2d2b0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
2d2c0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2d2d0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
2d2e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2d2f0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
2d300 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
2d310 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d320 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
2d330 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2d340 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
2d350 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
2d360 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2d370 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
2d380 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
2d390 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
2d3a0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
2d3b0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
2d3c0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
2d3d0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
2d3e0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
2d3f0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
2d400 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
2d410 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
2d420 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
2d430 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d440 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ause */.  u16 nC
2d450 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2d460 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2d470 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
2d480 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
2d490 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
2d4a0 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
2d4b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d4c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d4e0 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
2d4f0 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
2d500 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
2d510 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
2d520 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d530 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2d540 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
2d550 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2d560 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
2d570 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
2d580 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
2d590 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
2d5a0 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
2d5b0 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
2d5c0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
2d5d0 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
2d5e0 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
2d5f0 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
2d600 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2d610 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2d620 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
2d630 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2d640 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
2d650 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
2d660 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2d670 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2d680 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
2d690 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
2d6a0 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
2d6b0 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
2d6c0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
2d6d0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
2d6e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2d6f0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
2d700 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
2d710 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
2d720 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
2d730 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2d740 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
2d750 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
2d760 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
2d770 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
2d780 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
2d790 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
2d7a0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
2d7b0 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
2d7c0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
2d7d0 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
2d7e0 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
2d7f0 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
2d800 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
2d810 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
2d820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2d830 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
2d840 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
2d850 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
2d860 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
2d870 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
2d880 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
2d890 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
2d8a0 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
2d8b0 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
2d8c0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2d8d0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2d8e0 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
2d8f0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
2d900 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
2d910 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
2d920 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
2d930 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
2d940 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
2d950 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
2d960 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
2d970 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
2d980 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
2d990 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2d9a0 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
2d9b0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
2d9c0 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
2d9d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
2d9e0 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2d9f0 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
2da00 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
2da10 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
2da20 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
2da30 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
2da40 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2da50 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
2da60 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
2da70 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
2da80 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
2da90 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2daa0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
2dab0 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
2dac0 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
2dad0 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
2dae0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
2daf0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
2db00 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
2db10 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
2db20 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2db30 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
2db40 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
2db50 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
2db60 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
2db70 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
2db80 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
2db90 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
2dba0 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
2dbb0 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
2dbc0 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
2dbd0 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
2dbe0 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
2dbf0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2dc00 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
2dc10 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
2dc20 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
2dc30 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
2dc40 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
2dc50 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
2dc60 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
2dc70 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
2dc80 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
2dc90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2dca0 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
2dcb0 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
2dcc0 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
2dcd0 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
2dce0 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
2dcf0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
2dd00 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61  0 );..  /* Sorta
2dd10 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61  bility of virtua
2dd20 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65  l tables is dete
2dd30 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42  rmined by the xB
2dd40 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a  estIndex method.
2dd50 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74    ** of the virt
2dd60 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66  ual table itself
2dd70 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d   */.  if( pLast-
2dd80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2dd90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
2dda0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
2ddb0 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72  Loop>0 );  /* Tr
2ddc0 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f  ue when outer lo
2ddd0 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20  ops are one-row 
2dde0 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20  and match .     
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52       ** no ORDER
2de10 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   BY terms */.   
2de20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75   return pLast->u
2de30 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b  .vtab.isOrdered;
2de40 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  .  }.  if( nLoop
2de50 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2de60 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
2de70 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2de80 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
2de90 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
2dea0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2deb0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
2dec0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
2ded0 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
2dee0 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
2def0 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
2df00 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
2df10 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
2df20 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2df30 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
2df40 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
2df50 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
2df60 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
2df70 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28  eady = 0;.  for(
2df80 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
2df90 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
2dfa0 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
2dfb0 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
2dfc0 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
2dfd0 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
2dfe0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2dff0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f      pLoop = iLoo
2e000 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  p<nLoop ? pPath-
2e010 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20  >aLoop[iLoop] : 
2e020 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pLast;.    asser
2e030 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
2e040 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2e050 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
2e060 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
2e070 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2e080 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
2e090 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
2e0a0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
2e0b0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
2e0c0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
2e0d0 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2e0e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
2e0f0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
2e100 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
2e110 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
2e120 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2e130 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
2e140 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
2e150 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
2e160 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
2e170 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e180 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2e190 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2e1a0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2e1b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2e1c0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2e1d0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2e1e0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e1f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
2e200 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2e210 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2e220 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
2e230 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2e240 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2e250 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
2e260 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
2e270 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
2e280 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
2e2b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
2e2c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2e2d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2e2e0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2e2f0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
2e300 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
2e310 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
2e320 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2e330 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
2e340 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2e350 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2e360 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2e370 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e380 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2e390 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2e3a0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2e3b0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
2e3c0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2e3d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2e3e0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2e3f0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2e400 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
2e410 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2e420 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2e430 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2e440 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
2e450 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2e460 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2e470 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
2e480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2e490 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
2e4a0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2e4b0 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
2e4c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2e4d0 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
2e4e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2e4f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e500 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
2e510 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
2e520 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30       nColumn = 0
2e530 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2e540 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
2e550 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2e560 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
2e570 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
2e580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2e590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e5a0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2e5b0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
2e5c0 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2e5d0 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65  Distinct = pInde
2e5e0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
2e5f0 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  one;.      }..  
2e600 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2e610 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2e620 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2e630 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2e640 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2e650 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2e660 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2e670 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2e680 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2e690 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2e6a0 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2e6b0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2e6c0 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =nColumn; j++){.
2e6d0 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
2e6e0 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
2e6f0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
2e700 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
2e710 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
2e720 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
2e730 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
2e740 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
2e750 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2e760 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
2e770 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2e780 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
2e790 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2e7a0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2e7b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
2e7c0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
2e7d0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2e7e0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2e7f0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
2e800 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2e810 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2e820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2e830 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2e840 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2e850 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
2e860 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
2e870 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
2e880 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
2e890 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
2e8a0 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
2e8b0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
2e8c0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
2e8d0 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c        if( j<nCol
2e8e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2e8f0 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78   /* Normal index
2e900 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2e910 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2e920 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2e930 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
2e940 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
2e950 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
2e960 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2e970 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
2e980 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
2e990 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2e9a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e9b0 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49       /* The ROWI
2e9c0 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20  D column at the 
2e9d0 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  end */.         
2e9e0 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c   assert( j==nCol
2e9f0 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  umn );.         
2ea00 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2ea10 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
2ea20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2ea30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
2ea40 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
2ea50 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
2ea60 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
2ea70 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
2ea80 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
2ea90 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a  t well-ordered .
2eaa0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2eab0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
2eac0 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20  stinct.         
2ead0 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  && iColumn>=0.  
2eae0 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f         && j>=pLo
2eaf0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
2eb00 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64           && pInd
2eb10 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ex->pTable->aCol
2eb20 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  [iColumn].notNul
2eb30 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  l==0.        ){.
2eb40 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2eb50 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2eb60 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2eb70 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52    /* Find the OR
2eb80 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74  DER BY term that
2eb90 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2eba0 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a  the j-th column.
2ebb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2ebc0 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20  e index and and 
2ebd0 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
2ebe0 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
2ebf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ec00 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
2ec10 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
2ec20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ec30 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
2ec40 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2ec50 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2ec60 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2ec70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ec80 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2ec90 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2eca0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2ecb0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2ecc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2ecd0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ece0 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
2ecf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ed00 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2ed10 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
2ed20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ed30 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
2ed40 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
2ed50 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
2ed60 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
2ed70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2ed80 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2ed90 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2eda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2edb0 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2edc0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2edd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ede0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
2edf0 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
2ee00 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2ee10 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
2ee20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2ee30 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2ee40 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2ee50 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2ee60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2ee70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2ee80 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2ee90 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2eea0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2eeb0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
2eec0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
2eed0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
2eee0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2eef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ef00 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
2ef10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2ef20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ef30 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
2ef40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ef50 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
2ef60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ef70 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
2ef80 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
2ef90 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2efa0 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
2efb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2efc0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2efd0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(i);.          
2efe0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
2eff0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f000 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
2f010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2f020 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
2f030 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
2f040 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
2f050 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2f060 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20          ** Sort 
2f070 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76  order is irrelev
2f080 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20  ant for a GROUP 
2f090 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
2f0a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2f0b0 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
2f0c0 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e        if( (rev ^
2f0d0 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72   revIdx)!=pOrder
2f0e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
2f0f0 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  er ) return 0;. 
2f100 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2f110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f120 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
2f130 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
2f140 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
2f150 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
2f160 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41   *pRevMask |= MA
2f170 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20  SKBIT(iLoop);.  
2f180 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
2f190 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
2f1a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f1b0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2f1c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
2f1d0 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
2f1e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
2f1f0 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20  =0 || j<nColumn 
2f200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2f210 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
2f220 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
2f230 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2f240 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2f250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
2f280 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
2f290 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
2f2a0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
2f2b0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
2f2c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
2f2d0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2f2e0 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
2f2f0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f300 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
2f310 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
2f320 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
2f330 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
2f340 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
2f350 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
2f360 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
2f370 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
2f380 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2f390 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2f3a0 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
2f3b0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
2f3c0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2f3d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f3e0 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
2f3f0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2f400 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2f410 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
2f420 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f430 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
2f440 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
2f450 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
2f460 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69  Set, p)&~orderDi
2f470 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
2f480 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
2f490 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2f4a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f4b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
2f4c0 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
2f4d0 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
2f4e0 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
2f4f0 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
2f500 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
2f510 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
2f520 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73  urn 1;.  if( !is
2f530 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 20  OrderDistinct ) 
2f540 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2f550 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn -1;.}..#ifdef
2f560 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2f570 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
2f580 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
2f590 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2f5a0 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
2f5b0 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
2f5c0 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
2f5d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2f5e0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
2f5f0 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
2f600 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2f610 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
2f620 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
2f630 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
2f640 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
2f650 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
2f660 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
2f670 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
2f680 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
2f690 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  f.../*.** Given 
2f6a0 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
2f6b0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
2f6c0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
2f6d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2f6e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
2f6f0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
2f700 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
2f710 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
2f720 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
2f730 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
2f740 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
2f750 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
2f760 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
2f770 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
2f780 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
2f790 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
2f7a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2f7b0 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
2f7c0 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
2f7d0 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
2f7e0 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
2f7f0 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
2f800 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
2f810 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
2f820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
2f830 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
2f840 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
2f850 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
2f860 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
2f870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2f880 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
2f890 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2f8a0 2c 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77  , WhereCost nRow
2f8b0 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
2f8c0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
2f8d0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2f8e0 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
2f8f0 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
2f900 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
2f910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2f930 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
2f940 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2f950 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
2f960 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2f970 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
2f980 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2f990 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2f9a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2f9b0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2f9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2f9d0 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
2f9e0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
2f9f0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
2fa00 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
2fa10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2fa20 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2fa30 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  Cost rCost;     
2fa40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2fa50 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57  of a path */.  W
2fa60 68 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20  hereCost mxCost 
2fa70 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
2fa80 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
2fa90 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
2faa0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f  .  WhereCost rSo
2fab0 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  rtCost;         
2fac0 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20  /* Cost to do a 
2fad0 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  sort */.  int nT
2fae0 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
2faf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fb00 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
2fb10 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
2fb20 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
2fb30 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
2fb40 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
2fb50 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
2fb60 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
2fb70 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
2fb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fb90 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
2fba0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
2fbb0 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2fbc0 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
2fbd0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2fbe0 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
2fbf0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2fc00 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
2fc10 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
2fc20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
2fc30 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
2fc40 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2fc50 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
2fc60 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
2fc70 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
2fc80 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2fc90 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2fca0 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
2fcb0 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
2fcc0 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
2fcd0 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mory */.  char *
2fce0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
2fcf0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
2fd00 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2fd10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
2fd20 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2fd30 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2fd40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2fd50 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
2fd60 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
2fd70 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
2fd80 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
2fd90 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
2fda0 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
2fdb0 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
2fdc0 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
2fdd0 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
2fde0 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
2fdf0 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
2fe00 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
2fe10 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
2fe20 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
2fe30 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  ==1) ? 1 : (nLoo
2fe40 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
2fe50 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
2fe60 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
2fe70 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
2fe80 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
2fe90 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
2fea0 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41  er\n"));..  /* A
2feb0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2fec0 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
2fed0 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a   aTo and aFrom *
2fee0 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66  /.  ii = (sizeof
2fef0 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
2ff00 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
2ff10 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
2ff20 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
2ff30 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2ff40 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70  db, ii);.  if( p
2ff50 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
2ff60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ff70 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
2ff80 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
2ff90 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
2ffa0 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
2ffb0 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
2ffc0 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
2ffd0 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
2ffe0 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
2fff0 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
30000 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
30010 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
30020 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
30030 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
30040 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20  oop = pX;.  }.. 
30050 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
30060 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
30070 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
30080 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
30090 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
300a0 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
300b0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
300c0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
300d0 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
300e0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
300f0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
30100 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
30110 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
30120 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
30130 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
30140 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
30150 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
30160 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
30170 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
30180 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
30190 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
301a0 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29  =whereCost(25) )
301b0 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a  ;.  nFrom = 1;..
301c0 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20    /* Precompute 
301d0 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
301e0 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ing the final re
301f0 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65  sult set, if the
30200 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20   caller.  ** to 
30210 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30220 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65  n() was concerne
30230 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20  d about sorting 
30240 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  */.  rSortCost =
30250 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   0;.  if( pWInfo
30260 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
30270 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
30280 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
30290 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
302a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
302b0 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
302c0 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
302d0 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77  g is N*log2(N) w
302e0 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20  here N is the.  
302f0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f    ** number of o
30300 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20  utput rows. */. 
30310 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e     rSortCost = n
30320 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28  RowEst + estLog(
30330 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48  nRowEst);.    WH
30340 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28  ERETRACE(0x002,(
30350 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
30360 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f  %-3d\n", rSortCo
30370 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
30380 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
30390 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
303a0 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
303b0 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
303c0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
303d0 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
303e0 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
303f0 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
30400 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
30410 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
30420 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
30430 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
30440 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
30450 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
30460 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
30470 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
30480 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
30490 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
304a0 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
304b0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
304c0 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
304d0 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
304e0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
304f0 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20   maskNew;.      
30500 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
30510 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  k = 0;.        u
30520 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
30530 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
30540 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
30550 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d    u8 isOrdered =
30560 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
30570 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  d;.        if( (
30580 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
30590 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
305a0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
305b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
305c0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
305d0 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
305e0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
305f0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
30600 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
30610 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
30620 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
30630 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
30640 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
30650 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
30660 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
30670 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
30680 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
30690 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
306a0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
306b0 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f  whereCostAdd(rCo
306c0 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  st, pFrom->rCost
306d0 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  );.        maskN
306e0 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
306f0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
30700 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
30710 20 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56   if( !isOrderedV
30720 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  alid ){.        
30730 20 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50    switch( whereP
30740 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
30750 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30770 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
30780 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
30790 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
307c0 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20  Loop, &revMask) 
307d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
307e0 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20  ase 1:  /* Yes. 
307f0 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f   pFrom+pWLoop do
30800 65 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  es satisfy the O
30810 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
30820 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
30830 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
30840 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30850 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
30860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30870 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30880 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f    case 0:  /* No
30890 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
308a0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73  will require a s
308b0 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a  eparate sort */.
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
308d0 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  Ordered = 0;.   
308e0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
308f0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f               rCo
30910 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
30920 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f  d(rCost, rSortCo
30930 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
30940 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30950 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f        default: /
30960 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65  * Cannot tell ye
30970 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e  t.  Try again on
30980 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
30990 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
309a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
309b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
309c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
309d0 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
309e0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
309f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
30a00 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
30a10 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
30a20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
30a30 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
30a40 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
30a50 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
30a60 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
30a70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
30a80 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
30a90 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70  op==maskNew && p
30aa0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
30ab0 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c  id==isOrderedVal
30ac0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
30ad0 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
30ae0 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
30af0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30b10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
30b20 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
30b30 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
30b40 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d  oice && rCost>=m
30b50 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  xCost ){.#ifdef 
30b60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30b70 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30b80 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30b90 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30bb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
30bc0 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64  ip   %s cost=%3d
30bd0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bf0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
30c00 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
30c10 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
30c30 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
30c40 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
30c50 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
30c60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
30c70 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
30c80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30ca0 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74  /* Add a new Pat
30cb0 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73  h to the aTo[] s
30cc0 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  et */.          
30cd0 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
30ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30cf0 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
30d00 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
30d10 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
30d20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
30d30 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
30d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30d50 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
30d60 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
30d70 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
30d80 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
30d90 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
30da0 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31      for(jj=nTo-1
30db0 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c  ; aTo[jj].rCost<
30dc0 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61  mxCost; jj--){ a
30dd0 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20  ssert(jj>0); }. 
30de0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30df0 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
30e00 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
30e10 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30e20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
30e30 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
30e40 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
30e50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30e60 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
30e70 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
30e80 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
30e90 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30ea0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
30eb0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
30ec0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
30ed0 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
30ee0 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
30ef0 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
30f00 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
30f10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
30f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30f30 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
30f40 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
30f50 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30f60 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30f70 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30f80 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30f90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30fa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fc0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
30fd0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
30fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ff0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
31000 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
31010 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20  Loop), rCost,.  
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31030 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
31040 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
31050 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
31060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
31070 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31080 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
31090 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
310a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
310b0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
310c0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
310d0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
310e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
310f0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
31100 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
31110 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31120 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31130 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31140 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
31150 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
31160 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
31170 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
31180 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
31190 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
311a0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
311b0 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
311c0 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
311d0 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
311e0 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
311f0 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
31200 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
31210 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31220 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69  BLED.          i
31230 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
31240 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
31250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31260 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
31270 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
31280 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
31290 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
312a0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
312b0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
312c0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
312d0 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
312e0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
312f0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
31300 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31310 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31320 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31330 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
31340 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65  s cost=%-3d orde
31350 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
31360 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31370 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
31380 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
31390 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
313a0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
313b0 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
313c0 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
313d0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
313e0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
313f0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
31400 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
31410 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
31420 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
31430 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
31440 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
31450 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
31460 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
31470 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
31480 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
31490 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
314a0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
314b0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
314c0 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
314d0 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
314e0 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
314f0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
31500 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64  alid = isOrdered
31510 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70  Valid;.        p
31520 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
31530 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
31540 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
31550 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
31560 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
31570 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
31580 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
31590 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
315a0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
315b0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
315c0 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
315d0 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
315e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
315f0 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
31600 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
31610 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
31620 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
31630 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29  ->rCost>mxCost )
31640 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
31650 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
31660 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31670 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
31680 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31690 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
316a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
316b0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
316c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
316d0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
316e0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
316f0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
31700 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
31710 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
31720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31730 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
31740 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
31750 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
31760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
31770 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
31780 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
31790 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
317a0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
317b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
317c0 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
317d0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
317e0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
317f0 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
31800 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f  eredValid && pTo
31810 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
31820 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31830 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
31840 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
31850 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
31860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31870 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31880 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
31890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
318a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
318b0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
318c0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
318d0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
318e0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
318f0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
31900 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
31910 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
31920 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
31930 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
31940 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
31950 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
31960 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
31970 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
31980 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
31990 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
319a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
319b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
319c0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
319d0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
319e0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
319f0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
31a00 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
31a10 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61  rom = aFrom;.  a
31a20 73 73 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20  ssert( nFrom==1 
31a30 29 3b 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20  );.#if 0 /* The 
31a40 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65  following is nee
31a50 64 65 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20  ded if nFrom is 
31a60 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31  ever more than 1
31a70 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20   */.  for(ii=1; 
31a80 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
31a90 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
31aa0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
31ab0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
31ac0 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
31ad0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
31ae0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
31af0 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
31b00 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
31b10 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
31b20 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
31b30 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
31b40 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
31b50 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
31b60 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
31b70 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
31b80 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
31b90 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
31ba0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
31bb0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
31bc0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
31bd0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
31be0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
31bf0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
31c00 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
31c10 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
31c20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
31c30 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
31c40 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
31c50 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31c60 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
31c70 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
31c80 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31c90 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
31ca0 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
31cb0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
31cc0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
31cd0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
31ce0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
31cf0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
31d00 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
31d10 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
31d20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
31d30 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
31d40 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
31d50 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
31d60 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
31d70 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65  c==1 ) pWInfo->e
31d80 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
31d90 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
31da0 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  D;.  }.  if( pFr
31db0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
31dc0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
31dd0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
31de0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
31df0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
31e00 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
31e10 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
31e20 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
31e30 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42       pWInfo->bOB
31e40 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Sat = 1;.      p
31e50 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
31e60 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
31e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49  .    }.  }.  pWI
31e80 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
31e90 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
31ea0 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
31eb0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
31ec0 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
31ed0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
31ee0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
31ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31f00 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
31f10 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
31f20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
31f30 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
31f40 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
31f50 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
31f60 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
31f70 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
31f80 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
31f90 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
31fa0 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
31fb0 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
31fc0 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
31fd0 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
31fe0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
31ff0 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
32000 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
32010 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
32020 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
32030 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
32040 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
32050 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
32060 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
32070 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
32080 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
32090 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
320a0 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
320b0 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
320c0 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
320d0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
320e0 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
320f0 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
32100 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
32110 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
32120 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
32130 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
32140 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
32150 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
32160 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
32170 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
32180 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
32190 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
321a0 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
321b0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
321c0 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
321d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
321e0 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
321f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
32200 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
32210 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
32220 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
32230 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
32240 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
32250 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32260 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
32270 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
32280 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
32290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
322a0 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
322b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
322c0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
322d0 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
322e0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
322f0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
32300 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
32310 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72  lags = 0;.  pTer
32320 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
32330 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
32340 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_EQ, 0);.  if( 
32350 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f  pTerm ){.    pLo
32360 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
32370 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
32380 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
32390 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
323a0 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
323b0 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
323c0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
323d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
323e0 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
323f0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
32400 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
32410 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
32420 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
32430 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30  33==whereCost(10
32440 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
32450 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
32460 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
32470 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
32480 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
32490 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
324a0 6e 65 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72  ne || pIdx->pPar
324b0 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 63  tIdxWhere!=0 ) c
324c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
324d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
324e0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
324f0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
32500 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
32510 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  r, pIdx->aiColum
32520 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  n[j], 0, WO_EQ, 
32530 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
32540 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
32550 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65  eak;.        whe
32560 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49  reLoopResize(pWI
32570 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
32580 20 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20   pLoop, j);.    
32590 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
325a0 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
325b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
325c0 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  j!=pIdx->nColumn
325d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
325e0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
325f0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
32600 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
32610 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
32620 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d        if( (pItem
32630 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
32640 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
32650 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
32660 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32670 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
32680 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
32690 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
326a0 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
326b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
326c0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
326d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
326e0 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
326f0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
32700 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
32710 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
32720 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
32730 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68  = 39;  /* 39==wh
32740 65 72 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20  ereCost(15) */. 
32750 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32760 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
32770 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
32780 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
32790 28 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20  (WhereCost)1;.  
327a0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
327b0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
327c0 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
327d0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
327e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
327f0 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
32800 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
32810 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
32820 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
32830 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32840 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
32850 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b  fo->bOBSat =  1;
32860 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32870 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32880 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
32890 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
328a0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
328b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
328c0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
328d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
328e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
328f0 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
32900 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
32910 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
32920 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
32930 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
32940 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
32950 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
32960 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
32970 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
32980 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
32990 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
329a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
329b0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
329c0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
329d0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
329e0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
329f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
32a00 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
32a10 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
32a20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
32a30 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32a40 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
32a50 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
32a60 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
32a70 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
32a80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
32a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
32aa0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
32ab0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
32ac0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
32ad0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
32ae0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
32af0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
32b00 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
32b10 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
32b20 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
32b30 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
32b40 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
32b50 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
32b60 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
32b70 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
32b80 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
32b90 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
32ba0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
32bb0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
32bc0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
32bd0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
32be0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
32bf0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
32c00 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
32c10 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
32c20 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
32c30 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
32c40 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
32c50 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
32c60 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
32c70 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
32c80 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
32c90 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
32ca0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
32cb0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
32cc0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
32cd0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
32ce0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
32cf0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
32d00 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
32d30 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
32d40 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
32d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d60 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
32d70 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
32d80 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
32d90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
32da0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
32db0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
32dc0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
32dd0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
32de0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
32df0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
32e00 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
32e10 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
32e20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
32e30 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
32e40 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
32e50 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
32e60 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
32e70 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
32e80 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
32e90 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
32ea0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
32eb0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
32ec0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
32ed0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
32ee0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
32ef0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
32f00 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
32f10 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
32f20 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
32f30 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
32f40 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
32f50 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
32f60 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
32f70 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
32f80 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
32f90 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
32fa0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
32fb0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
32fc0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
32fd0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
32fe0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
32ff0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
33000 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
33010 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
33020 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
33030 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
33040 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
33050 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
33060 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
33070 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
33080 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
33090 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
330a0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
330b0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
330c0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
330d0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
330e0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
330f0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
33100 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
33110 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
33120 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
33130 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
33140 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
33150 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
33160 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
33170 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
33180 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
33190 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
331a0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
331b0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
331c0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
331d0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
331e0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
331f0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
33200 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
33210 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
33220 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
33230 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
33240 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
33250 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
33260 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
33270 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
33280 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
33290 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
332a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
332b0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
332c0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
332d0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
332e0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
332f0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
33300 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
33310 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
33320 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
33330 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33340 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
33350 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
33360 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
33370 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
33380 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
33390 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
333a0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
333b0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
333c0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
333d0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
333e0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
333f0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
33400 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
33410 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
33420 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
33430 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
33440 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
33450 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
33460 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
33470 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
33480 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
33490 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
334a0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
334b0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
334c0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
334d0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
334e0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
334f0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
33500 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
33510 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
33520 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
33530 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
33540 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
33550 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
33560 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
33570 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
33580 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
33590 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
335a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
335b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
335c0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
335d0 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
335e0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
335f0 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
33600 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
33610 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
33620 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
33630 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
33640 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
33650 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
33660 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
33670 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
33680 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
33690 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
336a0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  erBy is NULL..*/
336b0 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
336c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
336d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
336e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
336f0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
33700 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
33710 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20  ist,    /* FROM 
33720 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
33730 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
33740 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
33750 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
33760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
33770 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
33780 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
33790 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
337a0 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
337b0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
337c0 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
337d0 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
337e0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
337f0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
33800 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
33810 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
33820 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
33830 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
33840 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
33850 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
33860 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
33870 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
33880 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
33890 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
338a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
338b0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
338c0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
338d0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
338e0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
338f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33900 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
33910 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
33920 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
33930 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
33940 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
33950 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
33960 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
33970 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
33980 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
33990 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
339a0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
339b0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
339c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
339d0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
339e0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
339f0 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
33a00 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
33a10 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
33a20 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
33a30 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
33a40 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
33a50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
33a60 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
33a70 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
33a80 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
33a90 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
33aa0 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
33ab0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
33ac0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
33ad0 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
33ae0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
33af0 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
33b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
33b20 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
33b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b40 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
33b50 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
33b60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33b70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33b80 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
33b90 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
33ba0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
33bb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
33bc0 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
33bd0 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20  sizeof(sWLB));. 
33be0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
33bf0 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
33c00 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
33c10 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
33c20 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
33c30 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
33c40 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
33c50 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
33c60 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
33c70 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
33c80 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
33c90 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
33ca0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
33cb0 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
33cc0 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
33cd0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
33ce0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
33cf0 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
33d00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
33d10 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
33d20 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
33d30 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
33d40 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
33d50 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
33d60 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
33d70 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
33d80 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
33d90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
33da0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
33db0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
33dc0 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
33dd0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
33de0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33df0 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
33e00 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
33e10 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
33e20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
33e30 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
33e40 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
33e50 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
33e60 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
33e70 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
33e80 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
33e90 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
33ea0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
33eb0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
33ec0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
33ed0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
33ee0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
33ef0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
33f00 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
33f10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33f20 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
33f30 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
33f40 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
33f50 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
33f60 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
33f70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
33f80 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
33f90 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
33fa0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
33fb0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
33fc0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
33fd0 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
33fe0 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
33ff0 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
34000 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
34010 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
34020 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
34030 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
34040 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
34050 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
34060 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
34070 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
34080 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
34090 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
340a0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
340b0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
340c0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
340d0 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
340e0 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
340f0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
34100 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
34110 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
34120 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
34130 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
34140 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
34150 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
34160 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
34170 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
34180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
34190 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
341a0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
341b0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
341c0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
341d0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
341e0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
341f0 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
34200 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
34210 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
34220 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
34230 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t;.  pWInfo->pOr
34240 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
34250 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
34260 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
34270 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  Set;.  pWInfo->i
34280 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
34290 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
342a0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
342b0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
342c0 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
342d0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
342e0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
342f0 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
34300 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
34310 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
34320 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
34330 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
34340 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
34350 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
34360 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
34370 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
34380 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
34390 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
343a0 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
343b0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
343c0 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
343d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
343e0 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
343f0 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
34400 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
34410 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
34420 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
34430 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
34440 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
34450 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
34460 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
34470 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
34480 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
34490 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
344a0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
344b0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
344c0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
344d0 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
344e0 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
344f0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
34500 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
34510 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
34520 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
34530 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
34540 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
34550 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
34560 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
34570 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
34580 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
34590 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
345a0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
345b0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
345c0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
345d0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
345e0 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
345f0 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
34600 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
34610 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
34620 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
34630 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
34640 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
34650 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
34660 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
34670 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
34680 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
34690 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  0;.  }..  /* Spe
346a0 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
346b0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
346c0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
346d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
346e0 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62  erBy ) pWInfo->b
346f0 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69  OBSat = 1;.    i
34700 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
34710 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
34720 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
34730 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
34740 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
34750 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
34760 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
34770 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
34780 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
34790 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
347a0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
347b0 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
347c0 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
347d0 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
347e0 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
347f0 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
34800 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
34810 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
34820 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
34830 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
34840 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
34850 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
34860 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
34870 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
34880 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
34890 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
348a0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
348b0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
348c0 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
348d0 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
348e0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
348f0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
34900 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
34910 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
34920 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
34930 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
34940 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
34950 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
34960 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
34970 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
34980 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
34990 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
349a0 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
349b0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
349c0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
349d0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
349e0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
349f0 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
34a00 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
34a10 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
34a20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
34a30 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
34a40 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
34a50 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
34a60 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
34a70 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
34a80 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
34a90 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
34aa0 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
34ab0 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
34ac0 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
34ad0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
34ae0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
34af0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
34b00 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
34b10 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
34b20 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
34b30 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
34b40 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
34b50 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
34b60 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  .  {.    Bitmask
34b70 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a   toTheLeft = 0;.
34b80 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
34b90 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
34ba0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69   ii++){.      Bi
34bb0 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
34bc0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
34bd0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
34be0 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
34bf0 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
34c00 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
34c10 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
34c20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
34c30 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
34c40 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
34c50 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
34c60 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
34c70 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
34c80 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
34c90 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
34ca0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
34cb0 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
34cc0 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
34cd0 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
34ce0 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
34cf0 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
34d00 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
34d10 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
34d20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
34d30 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
34d40 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
34d50 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
34d60 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
34d70 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
34d80 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
34d90 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
34da0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34db0 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
34dc0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28  f the ORDER BY (
34dd0 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
34de0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66  use contains ref
34df0 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72  erences to gener
34e00 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  al.  ** expressi
34e10 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e  ons, then we won
34e20 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61  't be able to sa
34e30 74 69 73 66 79 20 69 74 20 75 73 69 6e 67 20 69  tisfy it using i
34e40 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20  ndices, so.  ** 
34e50 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69 73  go ahead and dis
34e60 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  able it now..  *
34e70 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
34e80 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
34e90 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
34ea0 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20  TINCT)!=0 ){.   
34eb0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
34ec0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
34ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
34ee0 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
34ef0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
34f00 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  (pOrderBy->a[ii]
34f10 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
34f20 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
34f30 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
34f40 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
34f50 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
34f60 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
34f70 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
34f80 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
34f90 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  n<0 ){.        b
34fa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
34fb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77    }.  }..  if( w
34fc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34fd0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
34fe0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
34ff0 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
35000 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
35010 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
35020 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
35030 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
35040 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
35050 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
35060 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
35070 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35080 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35090 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
350a0 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
350b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
350c0 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
350d0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
350e0 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
350f0 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
35100 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
35110 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
35120 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
35130 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
35140 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
35150 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
35160 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
35170 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
35180 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
35190 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
351a0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
351b0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
351c0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
351d0 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
351e0 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
351f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
35200 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
35210 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35220 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35230 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73  r;.  .    /* Dis
35240 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
35250 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
35260 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20  s if wheretrace 
35270 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69  is enabled */.#i
35280 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
35290 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
352a0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
352b0 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  e ){.      Where
352c0 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
352d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
352e0 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
352f0 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
35300 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
35310 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35340 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
35350 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
35360 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
35370 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
35380 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
35390 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
353a0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
353b0 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
353c0 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
353d0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54  eLoopPrint(p, pT
353e0 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  abList);.      }
353f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35400 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
35410 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
35420 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
35430 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
35440 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
35450 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
35460 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
35470 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
35480 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
35490 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
354a0 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
354b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
354c0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
354d0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
354e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
354f0 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
35500 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
35510 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
35520 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
35530 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
35540 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
35550 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
35560 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
35570 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
35580 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
35590 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
355a0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
355b0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
355c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
355d0 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
355e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
355f0 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
35600 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
35610 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
35620 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
35630 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20  bOBSat ){.      
35640 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
35650 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25  tf(" ORDERBY=0x%
35660 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  llx", pWInfo->re
35670 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
35680 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
35690 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
356a0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
356b0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
356c0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
356d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
356e0 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
356f0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
35700 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
35710 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
35720 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
35730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
35740 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
35750 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
35760 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
35780 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35790 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
357a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
357b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
357c0 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
357d0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
357e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
357f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
35800 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
35810 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35820 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
35830 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
35840 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
35850 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
35860 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
35870 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
35880 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
35890 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
358a0 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
358b0 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72  not effect the r
358c0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70  esult */.  if( p
358d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
358e0 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65  .   && pResultSe
358f0 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  t!=0.   && Optim
35900 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
35910 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f  b, SQLITE_OmitNo
35920 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20  opJoin).  ){.   
35930 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
35940 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
35950 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
35960 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
35970 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
35980 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c  tabUsed |= exprL
35990 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
359a0 61 73 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79  askSet, pOrderBy
359b0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
359c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20  Info->nLevel>=2 
359d0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
359e0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
359f0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
35a00 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
35a10 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f  ->nLevel-1].pWLo
35a20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  op;.      if( (p
35a30 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
35a40 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
35a50 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
35a60 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FT)==0 ) break;.
35a70 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
35a80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
35a90 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
35aa0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
35ab0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35ac0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
35ad0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
35ae0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
35af0 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20     if( (tabUsed 
35b00 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
35b10 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  f)!=0 ) break;. 
35b20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42       pEnd = sWLB
35b30 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70  .pWC->a + sWLB.p
35b40 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  WC->nTerm;.     
35b50 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e   for(pTerm=sWLB.
35b60 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45  pWC->a; pTerm<pE
35b70 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
35b80 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
35b90 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
35ba0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
35bb0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  0.         && !E
35bc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
35bd0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
35be0 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
35bf0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
35c00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
35c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35c20 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62  ( pTerm<pEnd ) b
35c30 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52  reak;.      WHER
35c40 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
35c50 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
35c60 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
35c70 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
35c80 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
35c90 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69  --;.      nTabLi
35ca0 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st--;.    }.  }.
35cb0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
35cc0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
35cd0 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
35ce0 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  \n"));.  pWInfo-
35cf0 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  >pParse->nQueryL
35d00 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e  oop += pWInfo->n
35d10 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66  RowOut;..  /* If
35d20 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
35d30 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
35d40 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
35d50 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
35d60 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
35d70 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
35d80 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
35d90 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
35da0 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
35db0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
35dc0 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
35dd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
35de0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
35df0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
35e00 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
35e10 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
35e20 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
35e30 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
35e40 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
35e50 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
35e60 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
35e70 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
35e80 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
35e90 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
35ea0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
35eb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35ec0 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
35ed0 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
35ee0 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
35ef0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
35f00 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
35f10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
35f20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
35f30 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
35f40 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
35f50 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
35f60 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
35f70 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
35f80 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
35f90 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
35fa0 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65  .  for(ii=0, pLe
35fb0 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
35fc0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
35fd0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
35fe0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
35ff0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70    /* Table to op
36000 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  en */.    int iD
36010 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b;         /* In
36020 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20  dex of database 
36030 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
36040 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74  /index */.    st
36050 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
36060 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
36070 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
36080 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
36090 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
360a0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
360b0 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  Tab;.    iDb = s
360c0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
360d0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
360e0 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f  chema);.    pLoo
360f0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
36100 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
36110 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
36120 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
36130 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
36140 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
36150 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
36160 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
36170 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
36180 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
36190 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
361a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
361b0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
361c0 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
361d0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
361e0 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
361f0 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
36200 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
36210 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
36220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36230 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
36240 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
36250 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
36260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
36270 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
36280 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f   ){.      /* noo
36290 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  p */.    }else.#
362a0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
362b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
362c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
362d0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
362e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
362f0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
36300 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
36310 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  int op = pWInfo-
36320 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  >okOnePass ? OP_
36330 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f  OpenWrite : OP_O
36340 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73  penRead;.      s
36350 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
36360 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
36370 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
36380 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
36390 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
363a0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
363b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
363c0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
363d0 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
363e0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
363f0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
36400 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
36410 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
36420 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b  Tab->nCol<BMS ){
36430 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
36440 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
36450 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
36460 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
36470 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
36480 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
36490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
364a0 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
364b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
364c0 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
364f0 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
36500 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
36510 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
36520 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
36530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
36540 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
36550 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
36560 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
36570 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
36580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36590 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
365a0 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  DEX.    if( (pLo
365b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
365c0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
365d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
365e0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
365f0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
36600 6e 66 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49 74  nfo->sWC, pTabIt
36610 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  em, notReady, pL
36620 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  evel);.    }else
36630 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
36640 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36650 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
36660 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
36670 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
36680 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
36690 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
366a0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
366b0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
366c0 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58  x);.      /* FIX
366d0 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d  ME:  As an optim
366e0 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62  ization use pTab
366f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66  Item->iCursor if
36700 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
36710 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  */.      int iIn
36720 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  dexCur = pLevel-
36730 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43  >iIdxCur = iIdxC
36740 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70  ur ? iIdxCur : p
36750 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
36760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
36770 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
36780 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
36790 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
367a0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
367b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
367c0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
367d0 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
367e0 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36800 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
36810 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
36820 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62  DOFF);.      Vdb
36830 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
36840 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
36850 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36860 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
36870 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
36880 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
36890 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
368a0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61  o->sMaskSet, pTa
368b0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
368c0 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
368d0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
368e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
368f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
36900 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
36910 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
36920 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
36930 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
36940 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
36950 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
36960 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
36970 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
36980 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
36990 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
369a0 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
369b0 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
369c0 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
369d0 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
369e0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
369f0 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
36a00 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
36a10 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
36a20 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
36a30 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
36a40 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
36a50 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
36a60 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
36a70 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
36a80 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61  Info, ii, notRea
36a90 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
36aa0 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
36ab0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
36ac0 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
36ad0 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
36ae0 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
36af0 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
36b00 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
36b10 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
36b20 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
36b30 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
36b40 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
36b50 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
36b60 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
36b70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
36b80 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
36b90 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
36ba0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
36bb0 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
36bc0 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
36bd0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
36be0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
36bf0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
36c00 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
36c10 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
36c20 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
36c30 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
36c40 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
36c50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
36c60 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
36c70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
36c80 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
36c90 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
36ca0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
36cb0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
36cc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
36cd0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
36ce0 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
36cf0 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
36d00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
36d10 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
36d20 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
36d30 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
36d40 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
36d50 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
36d60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f  ->a[i];.    pLoo
36d70 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
36d80 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  op;.    sqlite3V
36d90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36da0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
36db0 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
36dc0 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
36dd0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
36de0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36df0 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
36e00 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
36e10 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2);.      sqlit
36e20 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
36e30 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
36e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
36e50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36e60 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
36e70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
36e80 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
36e90 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
36ea0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
36eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36ec0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
36ed0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
36ee0 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
36ef0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
36f00 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
36f10 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
36f20 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
36f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36f40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
36f50 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
36f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
36f80 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
36f90 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
36fa0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
36fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
36fc0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
36fd0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
36fe0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
36ff0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
37000 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
37010 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
37020 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
37030 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
37040 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
37050 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
37060 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
37070 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
37080 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
37090 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
370a0 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
370b0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73  tJoin);.      as
370c0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
370d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
370e0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
370f0 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
37100 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37110 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
37120 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
37130 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
37140 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
37150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37160 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37170 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
37180 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
37190 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
371a0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
371b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
371c0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
371d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
371e0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
371f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37210 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
37220 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
37230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37240 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
37250 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
37260 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
37270 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
37280 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
372a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
372b0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
372c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
372d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
372e0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
372f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
37300 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
37310 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
37320 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
37330 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
37340 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
37350 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37360 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
37370 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
37380 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
37390 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
373a0 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
373b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
373c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
373d0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
373e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
373f0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
37400 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
37410 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
37420 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
37430 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
37440 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
37450 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
37460 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
37470 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
37480 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
37490 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
374a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
374b0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
374c0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
374d0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
374e0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
374f0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
37500 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
37510 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
37520 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
37530 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
37540 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
37550 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
37560 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
37570 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
37580 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
37590 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77  >okOnePass && (w
375a0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
375b0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
375c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
375d0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
375e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
375f0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
37600 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
37610 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
37620 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49  & (ws & (WHERE_I
37630 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  PK|WHERE_AUTO_IN
37640 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  DEX))==0 ){.    
37650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37660 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
37670 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
37680 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
37690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
376a0 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
376b0 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45  index, make VDBE
376c0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
376d0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
376e0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
376f0 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
37700 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  f from the table
37710 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
37720 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a    In some cases.
37730 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69      ** this opti
37740 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74  mization prevent
37750 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  s the table from
37760 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64   ever being read
37770 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20  , which can.    
37780 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69  ** yield a signi
37790 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e  ficant performan
377a0 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a  ce boost..    **
377b0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
377c0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
377d0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
377e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
377f0 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
37800 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
37810 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
37820 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
37830 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
37840 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
37850 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
37860 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
37870 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
37880 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
37890 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
378a0 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
378b0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
378c0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
378d0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
378e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
378f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
37900 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
37910 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
37920 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
37930 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
37940 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
37950 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
37960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
37970 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
37980 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
37990 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
379a0 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21     if( pIdx && !
379b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
379c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c   ){.      int k,
379d0 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
379e0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
379f0 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
37a00 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
37a10 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
37a20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
37a30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
37a40 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
37a50 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
37a60 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
37a70 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
37a80 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
37a90 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
37aa0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
37ab0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
37ac0 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
37ad0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
37ae0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
37af0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
37b00 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
37b10 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
37b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
37b30 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
37b40 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
37b50 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
37b60 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
37b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37ba0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
37bb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37bc0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
37bd0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  j<pIdx->nColumn 
37be0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37bf0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
37c00 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
37c10 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
37c20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
37c30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
37c40 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
37c50 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
37c60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
37c70 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
37c80 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
37c90 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
37ca0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
37cb0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
37cc0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
37cd0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
37ce0 72 6e 3b 0a 7d 0a                                rn;.}.