/ Hex Artifact Content
Login

Artifact 30a9f5e4acd74e727b69a7f53a76863f9316b43b:


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 33  ITE_ENABLE_STAT3
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 7d 3b 0a   not NULL */.};.
4530: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45  ./*.** The WHERE
4540: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
4550: 6e 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ng routine has t
4560: 77 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a  wo halves.  The.
4570: 2a 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f  ** first part do
4580: 65 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  es the start of 
4590: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61  the WHERE loop a
45a0: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  nd the second.**
45b0: 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74   half does the t
45c0: 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45  ail of the WHERE
45d0: 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61   loop.  An insta
45e0: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73  nce of.** this s
45f0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
4600: 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  rned by the firs
4610: 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65  t half and passe
4620: 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  d.** into the se
4630: 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76  cond half to giv
4640: 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74  e some continuit
4650: 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  y..**.** An inst
4660: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
4670: 65 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f  ect holds the co
4680: 6d 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20  mplete state of 
4690: 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61  the query.** pla
46a0: 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  nner..*/.struct 
46b0: 57 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61  WhereInfo {.  Pa
46c0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
46e0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
46f0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4700: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
4710: 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  bList;        /*
4720: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
4730: 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
4740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4750: 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  rBy;       /* Th
4760: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
4770: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  e or NULL */.  E
4780: 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74  xprList *pResult
4790: 53 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73 75  Set;     /* Resu
47a0: 6c 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43 54  lt set. DISTINCT
47b0: 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68 65   operates on the
47c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  se */.  WhereLoo
47d0: 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20  p *pLoops;      
47e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
47f0: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
4800: 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ts */.  Bitmask 
4810: 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  revMask;        
4820: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
4830: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
4840: 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20   need reversing 
4850: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
4860: 52 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20 2f  RowOut;        /
4870: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
4880: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
4890: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
48a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
48b0: 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e   /* Flags origin
48c0: 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73  ally passed to s
48d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
48e0: 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61  () */.  u8 bOBSa
48f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4900: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73 61    /* ORDER BY sa
4910: 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63  tisfied by indic
4920: 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65  es */.  u8 okOne
4930: 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Pass;           
4940: 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f    /* Ok to use o
4950: 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
4960: 6d 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c  m for UPDATE/DEL
4970: 45 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65  ETE */.  u8 unte
4980: 73 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20  stedTerms;      
4990: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48     /* Not all WH
49a0: 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76  ERE terms resolv
49b0: 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70  ed by outer loop
49c0: 20 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e   */.  u8 eDistin
49d0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ct;             
49e0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
49f0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76  ERE_DISTINCT_* v
4a00: 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20  alues below */. 
4a10: 20 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20   u8 nLevel;     
4a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4a30: 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 6c  mber of nested l
4a40: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f  oop */.  int iTo
4a50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4a60: 20 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20 62     /* The very b
4a70: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
4a80: 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20  WHERE loop */.  
4a90: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20  int iContinue;  
4aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4ab0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ac0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63  ue with next rec
4ad0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  ord */.  int iBr
4ae0: 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eak;            
4af0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4b00: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
4b10: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
4b20: 74 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  t savedNQueryLoo
4b30: 70 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73  p;      /* pPars
4b40: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75  e->nQueryLoop ou
4b50: 74 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20  tside the WHERE 
4b60: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d  loop */.  WhereM
4b70: 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74 3b  askSet sMaskSet;
4b80: 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f      /* Map curso
4b90: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
4ba0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65  masks */.  Where
4bb0: 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20 20  Clause sWC;     
4bc0: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
4bd0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45  ition of the WHE
4be0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
4bf0: 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20  hereLevel a[1]; 
4c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
4c10: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
4c20: 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20  ch nest loop in 
4c30: 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  WHERE */.};../*.
4c40: 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20  ** Bitmasks for 
4c50: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e  the operators on
4c60: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
4c70: 74 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 61  ts.  These are a
4c80: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20  ll.** operators 
4c90: 74 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74 65  that are of inte
4ca0: 72 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 72  rest to the quer
4cb0: 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a  y planner.  An.*
4cc0: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
4cd0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ion of these val
4ce0: 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  ues can be used 
4cf0: 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66  when searching f
4d00: 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  or.** particular
4d10: 20 57 68 65 72 65 54 65 72 6d 73 20 77 69 74 68   WhereTerms with
4d20: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
4d30: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
4d40: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
4d50: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
4d60: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
4d70: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
4d80: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
4d90: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
4da0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
4db0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4dc0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
4dd0: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
4de0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
4df0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
4e00: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
4e10: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
4e20: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
4e30: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
4e40: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
4e50: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
4e60: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
4e70: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
4e80: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
4e90: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
4ea0: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
4eb0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
4ec0: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
4ed0: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
4ee0: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
4ef0: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
4f00: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
4f10: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
4f20: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
4f30: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
4f40: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
4f50: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
4f60: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
4f70: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
4f80: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
4f90: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
4fa0: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
4fb0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
4fc0: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
4fd0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
4fe0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
4ff0: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62  definitions of b
5000: 69 74 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  its in the Where
5010: 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69 65  Loop.wsFlags fie
5020: 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74 69  ld..** The parti
5030: 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
5040: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61 63  n of bits in eac
5050: 68 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70  h WhereLoop help
5060: 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65   to.** determine
5070: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 74   the algorithm t
5080: 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72 65  hat WhereLoop re
5090: 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65  presents..*/.#de
50a0: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
50b0: 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30  N_EQ    0x000000
50c0: 30 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f  01  /* x=EXPR */
50d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
50e0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
50f0: 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50  000002  /* x<EXP
5100: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
5110: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5120: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
5130: 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49  00000004  /* x I
5140: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
5150: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
5160: 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38  NULL  0x00000008
5170: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
5180: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5190: 43 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30  CONSTRAINT   0x0
51a0: 30 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20  000000f  /* Any 
51b0: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c  of the WHERE_COL
51c0: 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a  UMN_xxx values *
51d0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
51e0: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
51f0: 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58  0000010  /* x<EX
5200: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
5210: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
5220: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
5230: 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32  MIT    0x0000002
5240: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
5250: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
5260: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
5270: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
5280: 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20   0x00000030  /* 
5290: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
52a0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
52b0: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
52c0: 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20       0x00000040 
52d0: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
52e0: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
52f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5300: 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78  _IPK          0x
5310: 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69  00000100  /* x i
5320: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
5330: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65  IMARY KEY */.#de
5340: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58  fine WHERE_INDEX
5350: 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32  ED      0x000002
5360: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
5370: 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  .u.btree.pIndex 
5380: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66  is valid */.#def
5390: 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41  ine WHERE_VIRTUA
53a0: 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30  LTABLE 0x0000040
53b0: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
53c0: 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20  u.vtab is valid 
53d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
53e0: 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78  _IN_ABLE      0x
53f0: 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c  00000800  /* Abl
5400: 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20  e to support an 
5410: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23  IN operator */.#
5420: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45  define WHERE_ONE
5430: 52 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30  ROW       0x0000
5440: 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73  1000  /* Selects
5450: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
5460: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
5470: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
5480: 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20      0x00002000  
5490: 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74  /* OR using mult
54a0: 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a  iple indices */.
54b0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 55  #define WHERE_AU
54c0: 54 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30  TO_INDEX   0x000
54d0: 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61  04000  /* Uses a
54e0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
54f0: 78 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72  x */.../* Conver
5500: 74 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61  t a WhereCost va
5510: 6c 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f  lue (10 times lo
5520: 67 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20  g2(X)) into its 
5530: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e  integer value X.
5540: 0a 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72  .** A rough appr
5550: 6f 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  oximation is use
5560: 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  d.  The value re
5570: 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78  turned is not ex
5580: 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  act..*/.static u
5590: 36 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  64 whereCostToIn
55a0: 74 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a  t(WhereCost x){.
55b0: 20 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78    u64 n;.  if( x
55c0: 3c 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  <10 ) return 1;.
55d0: 20 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20    n = x%10;.  x 
55e0: 2f 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d  /= 10;.  if( n>=
55f0: 35 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c  5 ) n -= 2;.  el
5600: 73 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20  se if( n>=1 ) n 
5610: 2d 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33  -= 1;.  if( x>=3
5620: 20 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c   ) return (n+8)<
5630: 3c 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e  <(x-3);.  return
5640: 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d   (n+8)>>(3-x);.}
5650: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5660: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
5670: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
5680: 77 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20  ws from a WHERE 
5690: 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71  clause.*/.u64 sq
56a0: 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
56b0: 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e  RowCount(WhereIn
56c0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
56d0: 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54  eturn whereCostT
56e0: 6f 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f  oInt(pWInfo->nRo
56f0: 77 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wOut);.}../*.** 
5700: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
5710: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5720: 5f 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f  _xxxxx values to
5730: 20 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68   indicate how th
5740: 69 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  is.** WHERE clau
5750: 73 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75  se returns outpu
5760: 74 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ts for DISTINCT 
5770: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69  processing..*/.i
5780: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
5790: 73 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49  sDistinct(WhereI
57a0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
57b0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65  return pWInfo->e
57c0: 44 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a  Distinct;.}../*.
57d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
57e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
57f0: 73 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20  se returns rows 
5800: 69 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  in ORDER BY orde
5810: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  r..** Return FAL
5820: 53 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  SE if the output
5830: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72   needs to be sor
5840: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
5850: 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
5860: 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
5870: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
5880: 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
5890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
58a0: 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65  n the VDBE addre
58b0: 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a  ss or label to j
58c0: 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20  ump to in order 
58d0: 74 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69  to continue.** i
58e0: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20  mmediately with 
58f0: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
5900: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
5910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
5920: 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
5930: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5940: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5950: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
5960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5970: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
5980: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
5990: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
59a0: 6f 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f  o break.** out o
59b0: 66 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a  f a WHERE loop..
59c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
59d0: 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68  ereBreakLabel(Wh
59e0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
59f0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5a00: 6f 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  o->iBreak;.}../*
5a10: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
5a20: 69 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  if an UPDATE or 
5a30: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5a40: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72   can operate dir
5a50: 65 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20  ectly on.** the 
5a60: 72 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20  rowids returned 
5a70: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
5a80: 65 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  e.  Return FALSE
5a90: 20 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20   if doing an.** 
5aa0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
5ab0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75   might change su
5ac0: 62 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63  bsequent WHERE c
5ad0: 6c 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a  lause results..*
5ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5af0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
5b00: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
5b10: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5b20: 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f  >okOnePass;.}../
5b30: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f  *.** Move the co
5b40: 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e  ntent of pSrc in
5b50: 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74  to pDest.*/.stat
5b60: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d  ic void whereOrM
5b70: 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a  ove(WhereOrSet *
5b80: 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65  pDest, WhereOrSe
5b90: 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73  t *pSrc){.  pDes
5ba0: 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a  t->n = pSrc->n;.
5bb0: 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e    memcpy(pDest->
5bc0: 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73  a, pSrc->a, pDes
5bd0: 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73  t->n*sizeof(pDes
5be0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a  t->a[0]));.}../*
5bf0: 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72  .** Try to inser
5c00: 74 20 61 20 6e 65 77 20 70 72 65 72 65 71 75 69  t a new prerequi
5c10: 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20  site/cost entry 
5c20: 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72  into the WhereOr
5c30: 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20  Set pSet..**.** 
5c40: 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69  The new entry mi
5c50: 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e  ght overwrite an
5c60: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c   existing entry,
5c70: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
5c80: 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20  ** appended, or 
5c90: 69 74 20 6d 69 67 68 74 20 62 65 20 64 69 73 63  it might be disc
5ca0: 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65  arded.  Do whate
5cb0: 76 65 72 20 69 73 20 74 68 65 20 72 69 67 68 74  ver is the right
5cc0: 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61   thing.** so tha
5cd0: 74 20 70 53 65 74 20 6b 65 65 70 73 20 74 68 65  t pSet keeps the
5ce0: 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20   N_OR_COST best 
5cf0: 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20  entries seen so 
5d00: 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  far..*/.static i
5d10: 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  nt whereOrInsert
5d20: 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a  (.  WhereOrSet *
5d30: 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSet,      /* Th
5d40: 65 20 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20  e WhereOrSet to 
5d50: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  be updated */.  
5d60: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20  Bitmask prereq, 
5d70: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
5d80: 75 69 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e  uisites of the n
5d90: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68  ew entry */.  Wh
5da0: 65 72 65 43 6f 73 74 20 72 52 75 6e 2c 20 20 20  ereCost rRun,   
5db0: 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74       /* Run-cost
5dc0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
5dd0: 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  y */.  WhereCost
5de0: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 2f 2a   nOut         /*
5df0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
5e00: 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  ts for the new e
5e10: 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ntry */.){.  u16
5e20: 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73   i;.  WhereOrCos
5e30: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53  t *p;.  for(i=pS
5e40: 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61  et->n, p=pSet->a
5e50: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29  ; i>0; i--, p++)
5e60: 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d  {.    if( rRun<=
5e70: 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72  p->rRun && (prer
5e80: 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d  eq & p->prereq)=
5e90: 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  =prereq ){.     
5ea0: 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73   goto whereOrIns
5eb0: 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  ert_done;.    }.
5ec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c      if( p->rRun<
5ed0: 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65  =rRun && (p->pre
5ee0: 72 65 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70  req & prereq)==p
5ef0: 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20  ->prereq ){.    
5f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5f10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74  }.  }.  if( pSet
5f20: 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b  ->n<N_OR_COST ){
5f30: 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e  .    p = &pSet->
5f40: 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20  a[pSet->n++];.  
5f50: 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74    p->nOut = nOut
5f60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5f70: 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20   = pSet->a;.    
5f80: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d  for(i=1; i<pSet-
5f90: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; i++){.      
5fa0: 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74  if( p->rRun>pSet
5fb0: 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20  ->a[i].rRun ) p 
5fc0: 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20  = pSet->a + i;. 
5fd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
5fe0: 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74  rRun<=rRun ) ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65  urn 0;.  }.where
6000: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20  OrInsert_done:. 
6010: 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65   p->prereq = pre
6020: 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d  req;.  p->rRun =
6030: 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e   rRun;.  if( p->
6040: 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e  nOut>nOut ) p->n
6050: 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65  Out = nOut;.  re
6060: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
6070: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
6080: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
6090: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
60a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
60b0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
60c0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
60d0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pWC,        /* 
60e0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
60f0: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
6100: 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  d */.  WhereInfo
6110: 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20 20 20   *pWInfo        
6120: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70 72 6f  /* The WHERE pro
6130: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
6140: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49  */.){.  pWC->pWI
6150: 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
6160: 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b  pWC->pOuter = 0;
6170: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20  .  pWC->nTerm = 
6180: 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  0;.  pWC->nSlot 
6190: 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d  = ArraySize(pWC-
61a0: 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43  >aStatic);.  pWC
61b0: 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74  ->a = pWC->aStat
61c0: 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  ic;.}../* Forwar
61d0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
61e0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
61f0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6200: 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a  eClause*);../*.*
6210: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  * Deallocate all
6220: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
6230: 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f  ed with a WhereO
6240: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rInfo object..*/
6250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6260: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73  reOrInfoDelete(s
6270: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
6280: 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  eOrInfo *p){.  w
6290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
62a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
62b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
62c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
62d0: 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  cate all memory 
62e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
62f0: 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f  a WhereAndInfo o
6300: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6310: 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e   void whereAndIn
6320: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
6330: 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e   *db, WhereAndIn
6340: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
6350: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
6360: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
6370: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
6380: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6390: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
63a0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
63b0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
63c0: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
63d0: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
63e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
63f0: 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72   inverse of wher
6400: 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a  eClauseInit()..*
6410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6420: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
6430: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
6440: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
6450: 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c  reTerm *a;.  sql
6460: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
6470: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
6480: 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d  db;.  for(i=pWC-
6490: 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d  >nTerm-1, a=pWC-
64a0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61  >a; i>=0; i--, a
64b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
64c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
64d0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
64e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
64f0: 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b  e(db, a->pExpr);
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
6510: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6520: 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  _ORINFO ){.     
6530: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
6540: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49  te(db, a->u.pOrI
6550: 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nfo);.    }else 
6560: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
6570: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b   TERM_ANDINFO ){
6580: 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49  .      whereAndI
6590: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
65a0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20  >u.pAndInfo);.  
65b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
65c0: 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74  C->a!=pWC->aStat
65d0: 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ic ){.    sqlite
65e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d  3DbFree(db, pWC-
65f0: 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >a);.  }.}../*.*
6600: 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e  * Add a single n
6610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74  ew WhereTerm ent
6620: 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ry to the WhereC
6630: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
6640: 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65  ..** The new Whe
6650: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  reTerm object is
6660: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f   constructed fro
6670: 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74  m Expr p and wit
6680: 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68  h wtFlags..** Th
6690: 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e  e index in pWC->
66a0: 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57  a[] of the new W
66b0: 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75  hereTerm is retu
66c0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
66d0: 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65  .** 0 is returne
66e0: 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65  d if the new Whe
66f0: 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74  reTerm could not
6700: 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f   be added due to
6710: 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c   a memory.** all
6720: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20  ocation error.  
6730: 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  The memory alloc
6740: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69  ation failure wi
6750: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
6760: 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c  n.** the db->mal
6770: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
6780: 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65  o that higher-le
6790: 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  vel functions ca
67a0: 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a  n detect it..**.
67b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67c0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
67d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57  e size of the pW
67e0: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20  C->a[] array as 
67f0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
6800: 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20   If the wtFlags 
6810: 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65  argument include
6820: 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20  s TERM_DYNAMIC, 
6830: 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c  then responsibil
6840: 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69  ity.** for freei
6850: 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ng the expressio
6860: 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62  n p is assumed b
6870: 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  y the WhereClaus
6880: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
6890: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76   This is true ev
68a0: 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  en if this routi
68b0: 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f  ne fails to allo
68c0: 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
68d0: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  Term..**.** WARN
68e0: 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ING:  This routi
68f0: 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63  ne might realloc
6900: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73  ate the space us
6910: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57  ed to store.** W
6920: 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20  hereTerms.  All 
6930: 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72  pointers to Wher
6940: 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65  eTerms should be
6950: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74   invalidated aft
6960: 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  er.** calling th
6970: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63  is routine.  Suc
6980: 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62  h pointers may b
6990: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  e reinitialized 
69a0: 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  by referencing.*
69b0: 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  * the pWC->a[] a
69c0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
69d0: 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49  int whereClauseI
69e0: 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73  nsert(WhereClaus
69f0: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c  e *pWC, Expr *p,
6a00: 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20   u8 wtFlags){.  
6a10: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
6a20: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74  ;.  int idx;.  t
6a30: 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73  estcase( wtFlags
6a40: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6a50: 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32  );  /* EV: R-002
6a60: 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66  11-15100 */.  if
6a70: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57  ( pWC->nTerm>=pW
6a80: 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20  C->nSlot ){.    
6a90: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20  WhereTerm *pOld 
6aa0: 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71  = pWC->a;.    sq
6ab0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
6ac0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
6ad0: 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  >db;.    pWC->a 
6ae0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6af0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
6b00: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
6b10: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
6b20: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
6b30: 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67        if( wtFlag
6b40: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6b60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6b70: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
6b80: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c      pWC->a = pOl
6b90: 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
6ba0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  0;.    }.    mem
6bb0: 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64  cpy(pWC->a, pOld
6bc0: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
6bd0: 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b  0])*pWC->nTerm);
6be0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70  .    if( pOld!=p
6bf0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
6c00: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6c10: 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20  ee(db, pOld);.  
6c20: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
6c30: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
6c40: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43  llocSize(db, pWC
6c50: 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d  ->a)/sizeof(pWC-
6c60: 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54  >a[0]);.  }.  pT
6c70: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
6c80: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
6c90: 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  ];.  pTerm->pExp
6ca0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
6cb0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20  kipCollate(p);. 
6cc0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
6cd0: 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65  = wtFlags;.  pTe
6ce0: 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  rm->pWC = pWC;. 
6cf0: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
6d00: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69  = -1;.  return i
6d10: 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dx;.}../*.** Thi
6d20: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
6d30: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
6d40: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
6d50: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
6d60: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
6d70: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
6d80: 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72   by the AND oper
6d90: 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ator or some oth
6da0: 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73  er.** operator s
6db0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
6dc0: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54  op parameter.  T
6dd0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
6de0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66  tructure.** is f
6df0: 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74  illed with point
6e00: 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73  ers to subexpres
6e10: 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d  sions.  For exam
6e20: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48  ple:.**.**    WH
6e30: 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20  ERE  a=='hello' 
6e40: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31  AND coalesce(b,1
6e50: 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21  1)<10 AND (c+12!
6e60: 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20  =d OR c==22).** 
6e70: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
6e80: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
6e90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  _________/     \
6ea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
6eb0: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
6ec0: 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20  slot[0]         
6ed0: 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20     slot[1]      
6ee0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d           slot[2]
6ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6f00: 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
6f10: 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61   in pExpr is una
6f20: 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69  ltered.  All thi
6f30: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
6f40: 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d  s is make slot[]
6f50: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74   entries point t
6f60: 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77  o substructure w
6f70: 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a  ithin pExpr..**.
6f80: 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f  ** In the previo
6f90: 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20  us sentence and 
6fa0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20  in the diagram, 
6fb0: 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20  "slot[]" refers 
6fc0: 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43  to.** the WhereC
6fd0: 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e  lause.a[] array.
6fe0: 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72    The slot[] arr
6ff0: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
7000: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
7010: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
7020: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
7030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
7040: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
7050: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
7060: 20 2a 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b   *pExpr, u8 op){
7070: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b  .  pWC->op = op;
7080: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7090: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
70a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
70b0: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
70c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
70d0: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
70e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
70f0: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
7100: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
7110: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
7120: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
7130: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
7140: 69 61 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61  ialize a WhereMa
7150: 73 6b 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  skSet object.*/.
7160: 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b  #define initMask
7170: 53 65 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30  Set(P)  (P)->n=0
7180: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7190: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
71a0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
71b0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
71c0: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
71d0: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
71e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  t..*/.static Bit
71f0: 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65  mask getMask(Whe
7200: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
7210: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
7220: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
7230: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
7240: 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42  n<=(int)sizeof(B
7250: 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66  itmask)*8 );.  f
7260: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
7270: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
7280: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
7290: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
72a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41  .      return MA
72b0: 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
72c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
72d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
72e0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
72f0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
7300: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
7310: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
7320: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
7330: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
7340: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
7350: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7360: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
7370: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
7380: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
7390: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
73a0: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
73b0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
73c0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
73d0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
73e0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
73f0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
7400: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
7410: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
7420: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
7430: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
7440: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
7450: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
7460: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
7470: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
7480: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  r;.}../*.** Thes
7490: 65 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 20 28  e routine walk (
74a0: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
74b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
74c0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
74d0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
74e0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
74f0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
7500: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
7510: 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  * tree..*/.stati
7520: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
7530: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
7540: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72  reMaskSet*, Expr
7550: 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  List*);.static B
7560: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
7570: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
7580: 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63  eMaskSet*, Selec
7590: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
75a0: 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61  ask exprTableUsa
75b0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
75c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
75d0: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
75e0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
75f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7600: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
7610: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
7620: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
7630: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
7640: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
7650: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
7660: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7670: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
7680: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
7690: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
76a0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
76b0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
76c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
76d0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
76e0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
76f0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
7700: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53  MaskSet, p->x.pS
7710: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  elect);.  }else{
7720: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
7730: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
7740: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
7750: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  List);.  }.  ret
7760: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
7770: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
7780: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
7790: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
77a0: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
77b0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
77c0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
77d0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
77e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
77f0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
7800: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
7810: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
7820: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
7830: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
7840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7850: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
7860: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
7870: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
7880: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
7890: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
78a0: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
78b0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
78c0: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63  e( pS ){.    Src
78d0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d  List *pSrc = pS-
78e0: 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20  >pSrc;.    mask 
78f0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
7900: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7910: 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  pS->pEList);.   
7920: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
7930: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7940: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
7950: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
7960: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7970: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7980: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
7990: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
79a0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
79b0: 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , pS->pWhere);. 
79c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
79d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
79e0: 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29  et, pS->pHaving)
79f0: 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
7a00: 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20  (pSrc!=0) ){.   
7a10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7a20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
7a30: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
7a40: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
7a50: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
7a60: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
7a70: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
7a80: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
7a90: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7aa0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7ab0: 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20  a[i].pOn);.     
7ac0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20   }.    }.    pS 
7ad0: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
7ae0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
7af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7b00: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
7b10: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
7b20: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
7b30: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
7b40: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
7b50: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
7b60: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
7b70: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
7b80: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
7b90: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
7ba0: 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49  =", "IN", and "I
7bb0: 53 20 4e 55 4c 4c 22 0a 2a 2a 0a 2a 2a 20 49 4d  S NULL".**.** IM
7bc0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
7bd0: 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54   R-59926-26393 T
7be0: 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79 20 61  o be usable by a
7bf0: 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d  n index a term m
7c00: 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65  ust be.** of one
7c10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
7c20: 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20  g forms: column 
7c30: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
7c40: 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e  umn > expression
7c50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78  .** column >= ex
7c60: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
7c70: 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  < expression col
7c80: 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f  umn <= expressio
7c90: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
7ca0: 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  = column express
7cb0: 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70  ion > column exp
7cc0: 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d  ression >= colum
7cd0: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
7ce0: 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  < column express
7cf0: 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f  ion <= column co
7d00: 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72  lumn IN.** (expr
7d10: 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c  ession-list) col
7d20: 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79  umn IN (subquery
7d30: 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c  ) column IS NULL
7d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
7d50: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
7d60: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
7d70: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
7d80: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
7d90: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
7da0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
7db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
7dc0: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
7dd0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
7de0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
7df0: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
7e00: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
7e10: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
7e20: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
7e30: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
7e40: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
7e50: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
7e60: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
7e70: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
7e80: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
7e90: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
7ea0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
7eb0: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
7ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
7ed0: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
7ee0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
7ef0: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
7f00: 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65  left/right prece
7f10: 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65  dence rules come
7f20: 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20   into play when 
7f30: 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a  determining the.
7f40: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
7f50: 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c  uence, then COLL
7f60: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72  ATE operators ar
7f70: 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e  e adjusted to en
7f80: 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  sure.** that the
7f90: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7fa0: 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  nce does not cha
7fb0: 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nge.  For exampl
7fc0: 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65  e:.** "Y collate
7fd0: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
7fe0: 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62  comes "X op Y" b
7ff0: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
8000: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
8010: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
8020: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
8030: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
8040: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
8050: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
8060: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
8070: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
8080: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f  reason the EP_Co
8090: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
80a0: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
80b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
80c0: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
80d0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80e0: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
80f0: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
8100: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
8110: 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75  EP_Collate);.  u
8120: 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45  16 expLeft = (pE
8130: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
8140: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
8150: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
8160: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
8170: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
8180: 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70  _IN );.  if( exp
8190: 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29  Right==expLeft )
81a0: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
81b0: 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76  X and Y both hav
81c0: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
81d0: 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f  or or neither do
81e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52   */.    if( expR
81f0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ight ){.      /*
8200: 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61   Both X and Y ha
8210: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
8220: 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  tors.  Make sure
8230: 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20   X is always.   
8240: 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c     ** used by cl
8250: 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f  earing the EP_Co
8260: 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20  llate flag from 
8270: 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70  Y. */.      pExp
8280: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
8290: 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b   &= ~EP_Collate;
82a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
82b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
82c0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
82d0: 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
82e0: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58      /* Neither X
82f0: 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c   nor Y have COLL
8300: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62  ATE operators, b
8310: 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64  ut X has a non-d
8320: 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  efault.      ** 
8330: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8340: 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20  ce.  So add the 
8350: 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65  EP_Collate marke
8360: 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a  r on X to cause.
8370: 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62        ** it to b
8380: 65 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74  e searched first
8390: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
83a0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c  ->pLeft->flags |
83b0: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20  = EP_Collate;.  
83c0: 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45    }.  }.  SWAP(E
83d0: 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  xpr*,pExpr->pRig
83e0: 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ht,pExpr->pLeft)
83f0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
8400: 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p>=TK_GT ){.    
8410: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
8420: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_GT+2 );.    as
8430: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
8440: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  LE+2 );.    asse
8450: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
8460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
8470: 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20  K_GT<TK_LE );.  
8480: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8490: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
84a0: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
84b0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
84c0: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
84d0: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
84e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
84f0: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
8500: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
8510: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
8520: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
8530: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
8540: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
8550: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
8560: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
8570: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
8580: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
8590: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
85a0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
85b0: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
85c0: 20 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45     assert( (WO_E
85d0: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c  Q<<(op-TK_EQ)) <
85e0: 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63   0x7fff );.    c
85f0: 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c   = (u16)(WO_EQ<<
8600: 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d  (op-TK_EQ));.  }
8610: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
8620: 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57  K_ISNULL || c==W
8630: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73  O_ISNULL );.  as
8640: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20  sert( op!=TK_IN 
8650: 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  || c==WO_IN );. 
8660: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8670: 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29  EQ || c==WO_EQ )
8680: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
8690: 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LT || c==WO_L
86a0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
86b0: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57  p!=TK_LE || c==W
86c0: 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LE );.  assert
86d0: 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63  ( op!=TK_GT || c
86e0: 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73  ==WO_GT );.  ass
86f0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c  ert( op!=TK_GE |
8700: 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20  | c==WO_GE );.  
8710: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
8720: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
8730: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
8740: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
8750: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
8760: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
8770: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
8780: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
8790: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
87a0: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
87b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
87c0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
87d0: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
87e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
87f0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
8800: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
8810: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
8820: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
8830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
8840: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
8850: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
8860: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
8870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
8880: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
8890: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
88a0: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
88b0: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
88c0: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
88d0: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
88e0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
88f0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
8900: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
8910: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
8920: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
8930: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
8940: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
8950: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
8960: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
8970: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
8980: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
8990: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
89a0: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
89b0: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
89c0: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
89d0: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
89e0: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
89f0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
8a00: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
8a10: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
8a20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
8a30: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
8a40: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
8a50: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
8a60: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
8a70: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8a80: 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c  ur && pTerm->u.l
8a90: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
8aa0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8ab0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8ac0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
8ad0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
8ae0: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
8af0: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
8b00: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
8b10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
8b20: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
8b30: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
8b40: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
8b50: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
8b60: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8b70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
8b80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
8b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
8ba0: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
8bb0: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8bd0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8be0: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8c00: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
8c10: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
8c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8c60: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
8c70: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
8c90: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
8ca0: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
8cb0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8cc0: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
8cd0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
8ce0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8cf0: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
8d00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8d20: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
8d30: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
8d40: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
8d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
8d60: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
8d70: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
8d80: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
8d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8da0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8db0: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
8dc0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8dd0: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
8de0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
8df0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
8e00: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
8e10: 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  rse = pWC->pWInf
8e20: 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  o->pParse;.     
8e30: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
8e40: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
8e50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
8e60: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
8e70: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
8e80: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8ec0: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
8ed0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
8ee0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
8ef0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
8f00: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
8f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58     pX->pLeft, pX
8f50: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8f60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
8f70: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
8f80: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
8f90: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
8fa0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8fb0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
8fc0: 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f  Name, pScan->zCo
8fd0: 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  llName) ){.     
8fe0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8ff0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
9000: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9010: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
9020: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
9030: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30  ator & WO_EQ)!=0
9040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
9050: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
9060: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
9070: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
9080: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
9090: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
90a0: 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20  Equiv[0].       
90b0: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
90c0: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  lumn==pScan->aEq
90d0: 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20  uiv[1].         
90e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
90f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9100: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9110: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
9120: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
9130: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
9140: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9160: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
9170: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70   = pScan->pWC->p
9180: 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d  Outer;.      k =
9190: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
91a0: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
91b0: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b  ->pOrigWC;.    k
91c0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d   = 0;.    pScan-
91d0: 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >iEquiv += 2;.  
91e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
91f0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
9200: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
9210: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
9220: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9230: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
9240: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
9250: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
9260: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
9270: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
9280: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
9290: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
92a0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
92b0: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
92c0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
92d0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
92e0: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
92f0: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
9300: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
9310: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
9320: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
9330: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
9340: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
9350: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
9360: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
9370: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
9380: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
9390: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
93a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
93b0: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
93c0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
93d0: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
93e0: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
93f0: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
9400: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
9410: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
9420: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
9430: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
9440: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
9450: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
9460: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
9470: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
9480: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
9490: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
94a0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
94b0: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
94c0: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
94d0: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
94e0: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
94f0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
9500: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
9510: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
9520: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
9530: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
9540: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
9550: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
9560: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
9570: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9580: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
9590: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
95a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
95b0: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
95c0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
95d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
95e0: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
95f0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
9600: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
9610: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
9620: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
9630: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
9640: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
9650: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
9660: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
9670: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
9680: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
9690: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
96a0: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
96b0: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
96c0: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
96d0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
96e0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
96f0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
9700: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
9710: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
9720: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9730: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
9740: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
9750: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
9760: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
9770: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
9780: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
9790: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
97a0: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
97b0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
97c0: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
97d0: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
97e0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
97f0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
9800: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
9810: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
9820: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
9830: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
9840: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
9850: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
9860: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
9870: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
9880: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
9890: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
98a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
98b0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
98c0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
98d0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
98e0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
98f0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
9900: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
9910: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
9920: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
9930: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
9940: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
9950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9960: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
9970: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
9980: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
9990: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
99a0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
99b0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
99c0: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
99d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
99e0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
99f0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
9a00: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
9a10: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
9a20: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
9a30: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
9a40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
9a50: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
9a60: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
9a70: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
9a80: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
9a90: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
9aa0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
9ab0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
9ac0: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
9ad0: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
9ae0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
9af0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
9b00: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
9b10: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
9b20: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
9b30: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
9b40: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
9b50: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
9b60: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
9b70: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
9b80: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
9b90: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
9ba0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
9bb0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
9bc0: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
9bd0: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
9be0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
9bf0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
9c00: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
9c10: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
9c20: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
9c30: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9c40: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
9c50: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
9c60: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
9c70: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
9c80: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
9c90: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
9ca0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
9cb0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
9cc0: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
9cd0: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
9ce0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9cf0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
9d00: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
9d10: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
9d20: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
9d30: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
9d40: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
9d50: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
9d60: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
9d70: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
9d80: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
9d90: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
9da0: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
9db0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
9dc0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
9dd0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9de0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
9df0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
9e00: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
9e10: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
9e20: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
9e30: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
9e40: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9e50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9e60: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
9e70: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
9e80: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
9e90: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
9ea0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
9eb0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9ed0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
9ee0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
9ef0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
9f00: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
9f10: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
9f20: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
9f30: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
9f40: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
9f50: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
9f60: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
9f70: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
9f80: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
9f90: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
9fa0: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
9fb0: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
9fc0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
9fd0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
9fe0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
9ff0: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
a000: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
a010: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
a020: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
a030: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
a040: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
a050: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
a060: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
a070: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
a080: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
a090: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
a0a0: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
a0b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
a0c0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
a0d0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
a0e0: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
a0f0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
a100: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
a110: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
a120: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
a130: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
a140: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
a150: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
a160: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
a170: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
a180: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
a190: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
a1a0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
a1b0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
a1c0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
a1d0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
a1e0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
a1f0: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
a200: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
a210: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
a220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a230: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
a240: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
a250: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
a260: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
a270: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
a280: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
a290: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
a2a0: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
a2b0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
a2c0: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
a2d0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
a2e0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
a2f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
a300: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
a310: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
a320: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
a330: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
a340: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
a350: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
a360: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
a370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
a380: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
a390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a3a0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
a3b0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
a3c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a3d0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
a3e0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
a3f0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
a400: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
a410: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
a420: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
a430: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
a440: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
a450: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
a460: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
a470: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
a480: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
a490: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
a4a0: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
a4b0: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
a4c0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
a4d0: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
a4e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
a4f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
a500: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
a510: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
a520: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
a530: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
a540: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
a550: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
a560: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
a570: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
a580: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a590: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
a5a0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
a5b0: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
a5e0: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
a5f0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
a600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a610: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
a620: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
a630: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
a640: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
a650: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
a660: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
a670: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a680: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
a690: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a6a0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
a6b0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
a6c0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6e0: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
a6f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
a700: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
a710: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
a720: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
a730: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
a740: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
a750: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
a760: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
a770: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
a780: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
a790: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
a7a0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
a7b0: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
a7c0: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
a7d0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a7e0: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
a7f0: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
a800: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
a810: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
a820: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
a830: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
a840: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
a850: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
a860: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
a870: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
a880: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
a890: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
a8a0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
a8b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a8c0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
a8d0: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
a8e0: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
a8f0: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
a900: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
a910: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
a920: 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68  pr;.  op = pRigh
a930: 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  t->op;.  if( op=
a940: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
a950: 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d      op = pRight-
a960: 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op2;.  }.  if( 
a970: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a980: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
a990: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
a9a0: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
a9b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
a9c0: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
a9d0: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
a9e0: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
a9f0: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
aa00: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
aa10: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
aa20: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
aa30: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
aa40: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
aa50: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
aa60: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
aa70: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
aa80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
aa90: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
aaa0: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
aab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
aac0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
aad0: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
aae0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
aaf0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
ab00: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
ab10: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
ab20: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
ab30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
ab40: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
ab50: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
ab60: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
ab70: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
ab80: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
ab90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
aba0: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
abb0: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
abc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
abd0: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
abe0: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
abf0: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
ac00: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
ac10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
ac20: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
ac30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
ac40: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
ac50: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
ac60: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
ac70: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
ac80: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
ac90: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
aca0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
acb0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
acc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
acd0: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
ace0: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
acf0: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
ad00: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
ad10: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
ad20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
ad30: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
ad40: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
ad50: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
ad60: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
ad70: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
ad80: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
ad90: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
ada0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
adb0: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
adc0: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
add0: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
ade0: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
adf0: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
ae00: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
ae10: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
ae20: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
ae30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
ae40: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
ae50: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
ae60: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
ae70: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
ae80: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
ae90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
aea0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
aeb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
aec0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
aed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aee0: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
aef0: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
af00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
af10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
af20: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
af30: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
af40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
af50: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
af60: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
af70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
af80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
af90: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
afa0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
afb0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
afc0: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
afd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
afe0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
aff0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
b000: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b010: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b020: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
b030: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
b040: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
b050: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
b060: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
b070: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
b080: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
b090: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
b0a0: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
b0b0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
b0c0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
b0d0: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
b0e0: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
b0f0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
b100: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b110: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
b120: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
b130: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
b140: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
b150: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
b160: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
b170: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
b180: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b190: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
b1a0: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
b1b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
b1c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b1d0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
b1e0: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
b1f0: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
b200: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b210: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
b220: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b230: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b240: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
b250: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
b260: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
b270: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
b280: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
b290: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
b2a0: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
b2b0: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
b2c0: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
b2d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
b2e0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
b2f0: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
b300: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
b310: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
b320: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
b330: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
b340: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
b350: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
b360: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
b370: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
b380: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b390: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
b3a0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
b3b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b3c0: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
b3d0: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
b3e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
b3f0: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
b400: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
b410: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
b420: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
b430: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
b440: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
b450: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
b480: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
b490: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
b4a0: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
b4b0: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
b4c0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
b4d0: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
b4e0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
b4f0: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
b500: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
b510: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
b520: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
b530: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
b540: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
b550: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
b560: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
b570: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
b580: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
b590: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
b5a0: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
b5b0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
b5c0: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
b5d0: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
b5e0: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
b5f0: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
b600: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
b610: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
b620: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
b630: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
b640: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
b650: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
b660: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
b670: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
b680: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
b690: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
b6a0: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
b6b0: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
b6c0: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
b6d0: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
b6e0: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
b6f0: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
b700: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
b710: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
b720: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
b730: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
b740: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
b750: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
b760: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
b770: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
b780: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
b790: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
b7a0: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
b7b0: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
b7c0: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
b7d0: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
b7e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
b7f0: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
b800: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
b810: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
b820: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
b830: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
b840: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
b850: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
b860: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
b870: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
b880: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
b890: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
b8a0: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
b8b0: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
b8c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
b8d0: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
b8e0: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
b8f0: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
b900: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
b910: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
b920: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
b930: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
b940: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
b950: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
b960: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
b970: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
b980: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
b990: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
b9a0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
b9b0: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
b9c0: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
b9d0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
b9e0: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
b9f0: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
ba00: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
ba10: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
ba20: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
ba30: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
ba40: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
ba50: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
ba60: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
ba70: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
ba80: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
ba90: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
baa0: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
bab0: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
bac0: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
bad0: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
bae0: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
baf0: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
bb00: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
bb10: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
bb20: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
bb30: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
bb40: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
bb50: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
bb60: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
bb70: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
bb80: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
bb90: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
bba0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
bbb0: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
bbc0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
bbd0: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
bbe0: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
bbf0: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
bc00: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
bc10: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
bc20: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
bc30: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
bc40: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
bc50: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
bc60: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
bc70: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
bc80: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
bc90: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
bca0: 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  * is something t
bcb0: 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72  he bestIndex() r
bcc0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
bcd0: 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61  rmine.  This ana
bce0: 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f  lysis.** only lo
bcf0: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
bd00: 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69  ubterms appropri
bd10: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
bd20: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
bd30: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
bd40: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c  ough E above all
bd50: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
bd60: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
bd70: 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69  ** also statisfi
bd80: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
bd90: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
bda0: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
bdb0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
bdc0: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
bdd0: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
bde0: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
bdf0: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
be00: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
be10: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
be20: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
be30: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
be40: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
be50: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
be60: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
be70: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
be80: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
be90: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
bea0: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
beb0: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
bec0: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
bed0: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
bee0: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
bef0: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
bf00: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
bf10: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
bf20: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
bf30: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
bf40: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
bf50: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
bf60: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
bf70: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
bf80: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
bf90: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
bfa0: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
bfb0: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
bfc0: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
bfd0: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
bfe0: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
bff0: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
c000: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
c010: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
c020: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
c030: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
c040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
c050: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
c060: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c070: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
c080: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
c090: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
c0a0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c0c0: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
c0d0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
c0e0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
c0f0: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
c100: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
c110: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
c120: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
c130: 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
c140: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
c150: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Parse;         /
c160: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
c170: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
c180: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1a0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
c1b0: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
c1c0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
c1d0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
c1e0: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
c1f0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
c200: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
c210: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
c220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c230: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
c240: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  he term */.  int
c250: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c280: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
c290: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
c2a0: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
c2b0: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
c2c0: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
c2d0: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
c2e0: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
c2f0: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
c300: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
c310: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
c320: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
c330: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
c340: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
c350: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
c360: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
c370: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
c380: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
c390: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
c3a0: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
c3b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
c3c0: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
c3d0: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
c3e0: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
c3f0: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
c400: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
c410: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
c420: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
c430: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
c440: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
c450: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
c460: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
c470: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
c480: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
c490: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
c4a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
c4b0: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
c4c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
c4d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
c4e0: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
c4f0: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
c500: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
c510: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
c520: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
c530: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
c540: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
c550: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c560: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
c570: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
c580: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
c590: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
c5a0: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
c5b0: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
c5c0: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
c5d0: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
c5e0: 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
c5f0: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
c600: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
c610: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
c620: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
c630: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c640: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
c650: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
c660: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
c670: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
c680: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
c690: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
c6a0: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
c6b0: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
c6c0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
c6d0: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
c6e0: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
c6f0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
c700: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
c710: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
c720: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
c730: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
c740: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
c750: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
c760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
c770: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
c780: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
c790: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
c7a0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
c7b0: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
c7c0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
c7d0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
c7e0: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
c7f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c800: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
c810: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
c820: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
c830: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
c840: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
c850: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c860: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
c870: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
c880: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
c890: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c8a0: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
c8b0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
c8c0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c8d0: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
c8e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
c8f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c900: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
c910: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
c920: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
c930: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
c940: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66  ndWC, pWC->pWInf
c950: 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  o);.        wher
c960: 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70  eSplit(pAndWC, p
c970: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54  OrTerm->pExpr, T
c980: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  K_AND);.        
c990: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
c9a0: 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20  Src, pAndWC);.  
c9b0: 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f        pAndWC->pO
c9c0: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
c9d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
c9e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c9f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
ca00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ca10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
ca20: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
ca30: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
ca40: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
ca50: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
ca60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ca70: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
ca80: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
ca90: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
caa0: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
cab0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
cac0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
cad0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
cae0: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
caf0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
cb00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
cb20: 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65         indexable
cb30: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
cb40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
cb50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
cb60: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
cb70: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69       /* Skip thi
cb80: 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20  s term for now. 
cb90: 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77   We revisit it w
cba0: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74  hen we process t
cbb0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  he.      ** corr
cbc0: 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56  esponding TERM_V
cbd0: 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20  IRTUAL term */. 
cbe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cbf0: 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20  Bitmask b;.     
cc00: 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57   b = getMask(&pW
cc10: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
cc20: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
cc30: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
cc40: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
cc50: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
cc60: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
cc70: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
cc80: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
cc90: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
cca0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
ccb0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
ccc0: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
ccd0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
cce0: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
ccf0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
cd00: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
cd10: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
cd20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
cd30: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
cd40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
cd50: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
cd60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cd70: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
cd80: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
cd90: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
cda0: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
cdb0: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
cdc0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
cdd0: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
cde0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
cdf0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ce00: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
ce10: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
ce20: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
ce30: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
ce40: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
ce50: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
ce60: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
ce70: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
ce80: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
ce90: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
cea0: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
ceb0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
cec0: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
ced0: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
cee0: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
cef0: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
cf00: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
cf10: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
cf20: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
cf30: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
cf40: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
cf50: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
cf60: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
cf70: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
cf80: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
cf90: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
cfa0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
cfb0: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
cfc0: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
cfd0: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
cfe0: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
cff0: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
d000: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
d010: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
d020: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
d030: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
d040: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
d050: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
d060: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
d070: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
d080: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
d090: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
d0a0: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
d0b0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
d0c0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
d0d0: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
d0e0: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
d0f0: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
d100: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
d110: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
d120: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
d130: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
d140: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
d150: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
d160: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
d170: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
d180: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
d190: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
d1a0: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
d1b0: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
d1c0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
d1d0: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
d1e0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
d1f0: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
d200: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
d210: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
d220: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
d230: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
d240: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
d250: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
d260: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
d270: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
d280: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
d290: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
d2a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
d2b0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
d2c0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
d2d0: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
d2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
d2f0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
d300: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
d310: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
d320: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
d330: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
d340: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
d350: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
d360: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d370: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d380: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
d390: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
d3a0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
d3b0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
d3c0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
d3d0: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
d3e0: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
d3f0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
d400: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
d410: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
d420: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
d430: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
d440: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
d450: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
d460: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
d470: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
d480: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
d490: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
d4a0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
d4b0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
d4c0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
d4d0: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
d4e0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
d4f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
d500: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
d510: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
d520: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
d530: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
d540: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
d550: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
d560: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
d570: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
d580: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d590: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
d5a0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
d5b0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
d5c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
d5d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d5e0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
d5f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
d600: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
d610: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
d620: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
d630: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
d640: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
d650: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
d660: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
d670: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
d680: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
d690: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
d6a0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d6b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d6c0: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
d6d0: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
d6e0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
d6f0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
d700: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
d710: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
d720: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
d730: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
d740: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
d750: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
d760: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
d770: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
d780: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
d790: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64  e either preceed
d7a0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
d7b0: 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e  or follwed by an
d7c0: 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28   inverted copy (
d7d0: 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b  t2.b==t1.a).  Sk
d7e0: 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20  ip this term .  
d7f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75          ** and u
d800: 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e  se its inversion
d810: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  . */.          t
d820: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
d830: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
d840: 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20  _COPIED );.     
d850: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d860: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d870: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
d880: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
d890: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  rt( pOrTerm->wtF
d8a0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50  lags & (TERM_COP
d8b0: 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  IED|TERM_VIRTUAL
d8c0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ) );.          c
d8d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d8e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75   }.        iColu
d8f0: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
d900: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
d910: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
d920: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
d930: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
d940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d950: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
d960: 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61     /* No candida
d970: 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20  te table+column 
d980: 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73  was found.  This
d990: 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   can only occur.
d9a0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
d9b0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
d9c0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  on */.        as
d9d0: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
d9e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
d9f0: 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54  PowerOfTwo(chngT
da00: 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  oIN) );.        
da10: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
da20: 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  ==getMask(&pWInf
da30: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
da40: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
da50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
da60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
da70: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
da80: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
da90: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
daa0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
dab0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
dac0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
dad0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
dae0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
daf0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
db00: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
db10: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
db20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
db30: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
db40: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
db50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
db60: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
db70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
db80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
db90: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
dba0: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
dbb0: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
dbc0: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
dbd0: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
dbe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
dbf0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
dc00: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
dc10: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
dc20: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
dc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dc40: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
dc50: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
dc60: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
dc70: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
dc80: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
dc90: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
dca0: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
dcb0: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
dcc0: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
dcd0: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
dce0: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
dcf0: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
dd00: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
dd10: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
dd20: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
dd30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dd40: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
dd50: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
dd60: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
dd70: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
dd80: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
dd90: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
dda0: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
ddb0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
ddc0: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
ddd0: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
dde0: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
ddf0: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
de00: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
de10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
de20: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
de30: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
de40: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
de50: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
de60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
de70: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
de80: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
de90: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
dea0: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
deb0: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
dec0: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
ded0: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
dee0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
def0: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
df00: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
df10: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
df20: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
df30: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
df40: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
df50: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
df60: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
df70: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
df80: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
df90: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
dfa0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
dfb0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
dfc0: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
dfd0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
dfe0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
dff0: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
e000: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
e010: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e020: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e030: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
e040: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
e050: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
e060: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
e070: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
e080: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
e090: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
e0a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
e0b0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
e0c0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
e0d0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
e0e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e0f0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
e100: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
e110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
e120: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
e130: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
e140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
e150: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
e160: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
e170: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
e180: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
e190: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
e1a0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
e1b0: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
e1c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
e1d0: 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  end(pWInfo->pPar
e1e0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
e1f0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
e200: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
e210: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
e220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e230: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
e240: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
e250: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
e260: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
e270: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
e280: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
e290: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
e2a0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
e2b0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
e2c0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
e2d0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
e2e0: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
e2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
e300: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
e310: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
e320: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
e330: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
e340: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
e350: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
e360: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
e370: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
e380: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
e390: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e3a0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
e3b0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
e3c0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
e3d0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
e3e0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
e3f0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
e400: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
e410: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
e420: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
e430: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
e440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e450: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e460: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
e470: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e480: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e490: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
e4a0: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
e4b0: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
e4c0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
e4d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
e4e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
e4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
e500: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
e510: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
e520: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
e530: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
e540: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
e550: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
e560: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
e570: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
e580: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
e590: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
e5a0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
e5b0: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
e5c0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
e5d0: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
e5e0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
e5f0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
e600: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
e610: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
e620: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
e630: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
e640: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
e650: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
e660: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
e670: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
e680: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
e690: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
e6a0: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
e6b0: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
e6c0: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
e6d0: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
e6e0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
e6f0: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
e700: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
e710: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
e720: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
e730: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
e740: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
e750: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
e760: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
e770: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
e780: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
e790: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
e7a0: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
e7b0: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
e7c0: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
e7d0: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
e7e0: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
e7f0: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
e800: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
e810: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
e820: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
e830: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
e840: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
e850: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
e860: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
e870: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
e880: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
e890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
e8a0: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
e8b0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
e8c0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
e8d0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
e8e0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
e900: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
e910: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
e920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e930: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
e940: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
e950: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
e960: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
e970: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
e980: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
e990: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e9a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
e9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e9c0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
e9d0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
e9e0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
e9f0: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
ea00: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
ea10: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
ea20: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
ea50: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
ea60: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
ea70: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
ea80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
ea90: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
eaa0: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
eab0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
eac0: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
ead0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
eae0: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
eaf0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
eb00: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
eb10: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
eb20: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
eb30: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
eb40: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb60: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
eb70: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
eb80: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
eb90: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
eba0: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
ebb0: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
ebc0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
ebd0: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ebf0: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
ec00: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
ec10: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
ec40: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
ec50: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
ec60: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
ec70: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
ec80: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ec90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
eca0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
ecb0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
ecc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ecd0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ece0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
ecf0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
ed00: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ed10: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
ed20: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
ed30: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
ed40: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
ed50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ed60: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
ed70: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
ed80: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
ed90: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
eda0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
edb0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
edc0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
edd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
ede0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
edf0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
ee00: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
ee10: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ee20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
ee30: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ee40: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ee50: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
ee60: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ee70: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
eea0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
eeb0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
eec0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
eed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
eee0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
eef0: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
ef00: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
ef10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ef20: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ef30: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
ef40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ef50: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
ef60: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
ef70: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ef80: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
ef90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
efa0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
efb0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
efc0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
efd0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
efe0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
eff0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
f000: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
f010: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
f020: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
f030: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
f040: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
f050: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
f060: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
f070: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
f080: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
f090: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
f0a0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
f0b0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
f0c0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
f0d0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
f0e0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
f0f0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
f100: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
f110: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
f120: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
f130: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f140: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
f150: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
f160: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
f170: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
f180: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
f190: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
f1a0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
f1b0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
f1c0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
f1d0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
f1e0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
f1f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
f200: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
f210: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
f220: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
f230: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
f240: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
f250: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
f260: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
f270: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
f280: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
f290: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
f2a0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
f2b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
f2c0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
f2d0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
f2e0: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
f2f0: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
f300: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
f310: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
f320: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
f330: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f340: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
f350: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
f360: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
f370: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
f380: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
f390: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
f3a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
f3b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f3c0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
f3d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
f3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3f0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
f400: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
f410: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
f420: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
f430: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
f440: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
f450: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
f460: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
f470: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
f480: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
f490: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
f4a0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
f4b0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
f4c0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
f4d0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
f4e0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
f4f0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
f500: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
f510: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
f520: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
f530: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
f540: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
f550: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
f560: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
f570: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
f580: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
f590: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f5a0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
f5b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
f5c0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
f5d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f5f0: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
f600: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
f610: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
f620: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
f630: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
f640: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
f650: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
f660: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
f670: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
f680: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
f690: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
f6a0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
f6b0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
f6c0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
f6d0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
f6e0: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
f6f0: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
f700: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
f710: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
f720: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
f730: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
f740: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
f750: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
f760: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
f770: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
f780: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
f790: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
f7a0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
f7b0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
f7c0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
f7d0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
f7e0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
f7f0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
f800: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
f810: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
f820: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
f830: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
f840: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
f850: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
f860: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
f870: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
f880: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
f890: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
f8a0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
f8b0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
f8c0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
f8d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
f8e0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
f8f0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
f900: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
f910: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
f920: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
f930: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
f940: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
f950: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
f960: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
f970: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
f980: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
f990: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
f9a0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
f9b0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
f9c0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
f9d0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
f9e0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
f9f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
fa00: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
fa10: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
fa20: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
fa30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
fa40: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
fa50: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
fa60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
fa70: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
fa80: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
fa90: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
faa0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
fab0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
fac0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
fad0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
fae0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
faf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
fb00: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
fb10: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
fb20: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
fb30: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
fb40: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
fb50: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fb80: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
fb90: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fbc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
fbd0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
fbe0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
fbf0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
fc00: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
fc10: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
fc20: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
fc30: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
fc40: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
fc50: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
fc60: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
fc70: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
fc80: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
fc90: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
fca0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
fcb0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
fcc0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
fcd0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
fce0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fcf0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
fd00: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
fd10: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fd20: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
fd30: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
fd40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fd50: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
fd60: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
fd70: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
fd80: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
fd90: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
fda0: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
fdb0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
fdc0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
fdd0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
fde0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
fdf0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
fe00: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
fe10: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
fe20: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
fe30: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
fe40: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
fe50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fe60: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
fe70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
fe80: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
fe90: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
fea0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
feb0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
fec0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
fed0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
fee0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
fef0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
ff00: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
ff10: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
ff20: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
ff30: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
ff40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
ff50: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
ff60: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
ff70: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
ff80: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
ff90: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
ffa0: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
ffb0: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
ffc0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
ffd0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
ffe0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
fff0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
10000 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
10010 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
10020 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
10030 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
10040 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
10050 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
10060 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
10070 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
10080 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
10090 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
100a0 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
100b0 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
100c0 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
100d0 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
100e0 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
100f0 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
10100 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
10110 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65     Token sCollSe
10120 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  qName;  /* Name 
10130 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
10140 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  uence */..    pL
10150 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
10160 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
10170 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
10180 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10190 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
101a0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
101b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
101c0 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
101d0 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
101e0 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
101f0 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
10200 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
10210 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
10220 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10230 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
10240 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
10250 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
10260 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
10270 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
10280 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
10290 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
102a0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
102b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
102c0 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
102d0 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
102e0 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
102f0 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
10300 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
10310 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
10320 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
10330 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
10340 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
10350 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
10360 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
10370 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
10380 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
10390 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
103a0 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
103b0 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
103c0 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
103d0 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
103e0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
103f0 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
10400 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
10410 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
10420 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
10430 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
10440 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
10450 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
10460 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53      }.    sCollS
10470 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73  eqName.z = noCas
10480 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
10490 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f  BINARY";.    sCo
104a0 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b  llSeqName.n = 6;
104b0 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
104c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
104d0 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
104e0 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
104f0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10500 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20  se, TK_GE, .    
10510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10520 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
10530 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
10540 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r1,&sCollSeqName
10550 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
10560 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
10570 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
10580 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
10590 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
105a0 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
105b0 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
105c0 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
105d0 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
105e0 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
105f0 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
10600 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
10610 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
10620 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
10630 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
10640 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
10650 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10660 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
10670 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65  Token(pParse,pNe
10680 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71  wExpr2,&sCollSeq
10690 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
106a0 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
106b0 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
106c0 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
106d0 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
106e0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
106f0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
10700 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
10710 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
10720 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
10730 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
10740 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10750 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
10760 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
10770 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
10780 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
10790 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
107a0 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
107b0 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
107c0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
107d0 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
107e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
107f0 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
10800 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
10810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10820 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10830 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
10840 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
10850 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
10860 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
10870 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
10880 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
10890 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
108a0 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
108b0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
108c0 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
108d0 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
108e0 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
108f0 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
10900 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
10910 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
10920 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
10930 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
10940 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
10950 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
10960 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
10970 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
10980 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
10990 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
109a0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
109b0 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
109c0 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
109d0 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
109e0 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
109f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
10a00 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
10a10 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
10a20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
10a30 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
10a40 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
10a50 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
10a60 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
10a70 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
10a80 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
10a90 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
10aa0 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
10ab0 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
10ac0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
10ad0 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
10ae0 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
10af0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10b00 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
10b30 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
10b40 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
10b50 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
10b60 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
10b70 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
10b80 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10b90 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10ba0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10bb0 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
10bc0 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
10bd0 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
10be0 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10bf0 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
10c00 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
10c10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
10c20 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
10c30 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10c40 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
10c50 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
10c60 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
10c70 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
10c80 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
10c90 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10ca0 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10cb0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10cc0 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10cd0 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10ce0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10cf0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10d00 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10d10 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10d20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
10d30 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
10d40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10d50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10d60 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10d70 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
10d80 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
10d90 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
10da0 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
10db0 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
10dc0 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
10dd0 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
10de0 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
10df0 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
10e00 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
10e10 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
10e20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
10e30 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
10e40 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
10e50 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
10e60 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
10e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
10e80 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
10e90 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
10ea0 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
10eb0 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
10ec0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
10ed0 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
10ee0 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
10ef0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10f00 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
10f10 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
10f20 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
10f30 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
10f40 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
10f50 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
10f60 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
10f70 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
10f80 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
10f90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
10fa0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
10fb0 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
10fc0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
10fd0 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
10fe0 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
10ff0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
11000 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
11010 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20   SQLITE_Stat3). 
11020 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
11030 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
11040 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
11050 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
11060 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
11070 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
11080 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
11090 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
110a0 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
110d0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
110e0 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
11110 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
11120 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
11130 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
11140 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
11150 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
11180 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
11190 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
111a0 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
111b0 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
111c0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
111d0 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
111e0 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
111f0 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
11200 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
11210 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
11220 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
11230 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
11240 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
11250 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
11260 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
11270 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  O_GT;.      pNew
11280 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
11290 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
112a0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
112b0 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
112c0 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
112d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
112e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
112f0 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
11300 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
11310 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
11320 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
11330 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11340 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a  ENABLE_STAT */..
11350 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
11360 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
11370 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
11380 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
11390 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
113a0 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
113b0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
113c0 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   join..  */.  pT
113d0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
113e0 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a   |= extraRight;.
113f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11400 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
11410 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72  pList for a entr
11420 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  y that matches t
11430 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
11440 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49  n.** of index pI
11450 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
11460 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  h an expression 
11470 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e  is found, its in
11480 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  dex in pList->a[
11490 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  ] is returned. I
114a0 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69  f.** no expressi
114b0 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20  on is found, -1 
114c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
114d0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
114e0 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65  ndexCol(.  Parse
114f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
11510 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
11520 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11540 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
11550 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  ist to search */
11560 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20  .  int iBase,   
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
11590 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
115a0 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
115b0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74   /* Index to mat
115e0 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a  ch column of */.
115f0 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69    /* Column of i
11620 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f  ndex to match */
11630 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
11640 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
11650 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
11660 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d  iCol];..  for(i=
11670 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
11680 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
11690 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
116a0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
116b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
116c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
116d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
116e0 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  && p->iColumn==p
116f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43  Idx->aiColumn[iC
11700 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  ol].     && p->i
11710 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20  Table==iBase.   
11720 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
11730 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
11740 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
11750 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
11760 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
11770 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
11780 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  ) && 0==sqlite3S
11790 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
117a0 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
117b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b         return i;
117c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
117d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   }..  return -1;
117e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
117f0 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
11800 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
11810 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
11820 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
11830 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
11840 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54  nt..**.** A DIST
11850 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64  INCT list is red
11860 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61  undant if the da
11870 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
11880 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a  some subset of.*
11890 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
118a0 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f  re unique and no
118b0 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n-null..*/.stati
118c0 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
118d0 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
118e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
118f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11900 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11910 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11920 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
11930 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
11940 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
11950 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  C,         /* Th
11960 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11970 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
11980 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a  istinct       /*
11990 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
119a0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
119b0 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a   DISTINCT */.){.
119c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
119d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
119e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20  .  int iBase;.. 
11a10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11a20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61  more than one ta
11a30 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63  ble or sub-selec
11a40 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  t in the FROM cl
11a50 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ause of.  ** thi
11a60 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
11a70 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
11a80 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68  sible to show th
11a90 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
11aa0 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
11ab0 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
11ac0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11ad0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11ae0 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62  ;.  iBase = pTab
11af0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
11b00 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61  or;.  pTab = pTa
11b10 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
11b20 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f  ;..  /* If any o
11b30 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11b40 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75  s is an IPK colu
11b50 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73  mn on table iBas
11b60 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
11b70 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a    ** true. Note:
11b80 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d   The (p->iTable=
11b90 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20  =iBase) part of 
11ba0 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65  this test may be
11bb0 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20   false if the.  
11bc0 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  ** current SELEC
11bd0 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  T is a correlate
11be0 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
11bf0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
11c00 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b  Distinct->nExpr;
11c10 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
11c20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
11c30 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73  SkipCollate(pDis
11c40 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  tinct->a[i].pExp
11c50 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
11c60 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
11c70 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
11c80 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
11c90 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
11ca0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
11cb0 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
11cc0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
11cd0 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
11ce0 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
11cf0 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
11d00 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
11d10 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
11d20 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
11d30 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
11d40 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
11d50 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
11d60 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
11d70 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
11d80 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
11d90 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
11da0 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
11db0 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
11dc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
11dd0 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
11de0 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
11df0 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
11e00 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
11e10 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
11e20 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
11e30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
11e40 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
11e50 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
11e60 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
11e70 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
11e80 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
11e90 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68  *   3. All of th
11ea0 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ose index column
11eb0 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
11ec0 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65  WHERE clause doe
11ed0 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
11ee0 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58  contain a "col=X
11ef0 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65  " term are subje
11f00 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c  ct to a NOT NULL
11f10 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
11f20 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
11f30 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
11f40 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
11f50 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
11f60 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
11f70 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
11f80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
11f90 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
11fa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
11fb0 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
11fc0 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
11fd0 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43   0==findTerm(pWC
11fe0 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e  , iBase, iCol, ~
11ff0 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45  (Bitmask)0, WO_E
12000 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  Q, pIdx) ){.    
12010 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20      int iIdxCol 
12020 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70  = findIndexCol(p
12030 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
12040 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69  , iBase, pIdx, i
12050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12060 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62  IdxCol<0 || pTab
12070 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
12080 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
12090 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
120a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
120b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
120c0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
120d0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
120e0 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
120f0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
12100 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
12110 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
12120 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
12130 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
12140 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12150 2f 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61  /* .** The (an a
12160 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20  pproximate) sum 
12170 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74  of two WhereCost
12180 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61  s.  This computa
12190 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61  tion is.** not a
121a0 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72   simple "+" oper
121b0 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65  ator because Whe
121c0 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64  reCost is stored
121d0 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69   as a logarithmi
121e0 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a  c.** value..** .
121f0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12200 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64  ost whereCostAdd
12210 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68  (WhereCost a, Wh
12220 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74  ereCost b){.  st
12230 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
12240 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b  ned char x[] = {
12250 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20  .     10, 10,   
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a        /* 0,1 */.
12280 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20        9, 9,     
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20       /* 2,3 */. 
122b0 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20       8, 8,      
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20      /* 4,5 */.  
122e0 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20      7, 7, 7,    
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20     /* 6,7,8 */. 
12310 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20       6, 6, 6,   
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a      /* 9,10,11 *
12340 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c  /.      5, 5, 5,
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20         /* 12-14 
12370 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34  */.      4, 4, 4
12380 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 4,            
12390 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38          /* 15-18
123a0 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20   */.      3, 3, 
123b0 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
123c0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32           /* 19-2
123d0 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c  4 */.      2, 2,
123e0 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
123f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d            /* 25-
12400 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28  31 */.  };.  if(
12410 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28   a>=b ){.    if(
12420 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e   a>b+49 ) return
12430 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   a;.    if( a>b+
12440 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b  31 ) return a+1;
12450 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b  .    return a+x[
12460 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  a-b];.  }else{. 
12470 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20     if( b>a+49 ) 
12480 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66  return b;.    if
12490 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72  ( b>a+31 ) retur
124a0 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n b+1;.    retur
124b0 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a  n b+x[b-a];.  }.
124c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
124d0 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f   an integer into
124e0 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49   a WhereCost.  I
124f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
12500 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64  ompute a.** good
12510 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e   approximatation
12520 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e   for 10*log2(x).
12530 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12540 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74  Cost whereCost(t
12550 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61  Rowcnt x){.  sta
12560 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b  tic WhereCost a[
12570 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
12580 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
12590 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20    WhereCost y = 
125a0 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b  40;.  if( x<8 ){
125b0 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72  .    if( x<2 ) r
125c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
125d0 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d  le( x<8 ){  y -=
125e0 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a   10; x <<= 1; }.
125f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
12600 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b  le( x>255 ){ y +
12610 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d  = 40; x >>= 4; }
12620 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35  .    while( x>15
12630 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20   ){  y += 10; x 
12640 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  >>= 1; }.  }.  r
12650 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79  eturn a[x&7] + y
12660 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65   - 10;.}..#ifnde
12670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12680 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
12690 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c   Convert a doubl
126a0 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66  e (as received f
126b0 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f  rom xBestIndex o
126c0 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
126d0 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65  e).** into a Whe
126e0 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65  reCost.  In othe
126f0 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65  r words, compute
12700 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f   an approximatio
12710 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32  n for.** 10*log2
12720 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  (x)..*/.static W
12730 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f  hereCost whereCo
12740 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75  stFromDouble(dou
12750 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b  ble x){.  u64 a;
12760 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a  .  WhereCost e;.
12770 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
12780 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
12790 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20  (a)==8 );.  if( 
127a0 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  x<=1 ) return 0;
127b0 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30  .  if( x<=200000
127c0 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68  0000 ) return wh
127d0 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74  ereCost((tRowcnt
127e0 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  )x);.  memcpy(&a
127f0 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20  , &x, 8);.  e = 
12800 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a  (a>>52) - 1022;.
12810 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d    return e*10;.}
12820 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12830 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12840 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73  BLE */../*.** Es
12850 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
12860 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
12870 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
12880 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  2..*/.static Whe
12890 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68  reCost estLog(Wh
128a0 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68  ereCost N){.  Wh
128b0 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72  ereCost x = wher
128c0 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  eCost(N);.  retu
128d0 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
128e0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
128f0 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
12900 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
12910 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
12920 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
12930 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
12940 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
12950 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
12960 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
12970 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
12980 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
12990 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
129a0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
129b0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
129c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
129d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
129e0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
129f0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
12a00 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
12a10 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
12a20 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12a30 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12a40 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12a50 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12a60 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12a70 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12a80 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12a90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12aa0 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
12ab0 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
12ac0 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
12ad0 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
12ae0 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
12af0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
12b00 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
12b10 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
12b20 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
12b30 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12b40 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
12b50 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12b60 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
12b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12b80 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12b90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12ba0 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
12bb0 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
12bc0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
12bd0 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
12be0 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
12bf0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12c00 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
12c10 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
12c20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12c30 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12c40 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12c50 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12c60 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12c70 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12c80 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12c90 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12ca0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12cb0 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
12cc0 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
12cd0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12ce0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12cf0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
12d00 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
12d10 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12d20 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
12d30 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
12d40 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
12d50 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
12d60 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
12d70 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
12d80 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
12d90 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
12da0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
12db0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
12dc0 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
12dd0 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
12de0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12df0 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
12e00 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
12e10 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
12e20 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
12e30 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
12e40 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
12e50 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
12e60 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
12e70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12e80 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
12e90 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
12ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12eb0 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
12ec0 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
12ed0 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
12ee0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
12ef0 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
12f00 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
12f10 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
12f20 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
12f30 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
12f40 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
12f50 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
12f60 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
12f70 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
12f80 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
12f90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12fa0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
12fb0 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
12fc0 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
12fd0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12fe0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12ff0 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
13000 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
13010 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
13020 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
13030 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
13040 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
13050 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13060 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
13070 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20  r & WO_EQ)==0 ) 
13080 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13090 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
130a0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
130b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
130c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
130d0 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
130e0 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
130f0 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
13100 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13110 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
13120 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
13130 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
13140 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
13150 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
13160 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
13170 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
13180 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
13190 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
131a0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
131b0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
131c0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
131d0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
131e0 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
131f0 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
13200 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
13210 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
13220 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
13230 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
13240 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
13250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
13260 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
13270 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13280 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13290 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
132a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
132b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
132c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
132d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
132e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
132f0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13300 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13310 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
13320 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
13330 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
13340 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
13350 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
13360 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
13370 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
13380 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
13390 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
133a0 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
133b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
133c0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
133d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
133e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
133f0 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
13400 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13410 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13420 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
13430 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
13440 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
13450 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
13460 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
13470 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
13480 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
134b0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
134c0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
134d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
134e0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
134f0 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
13500 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
13510 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13530 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
13540 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
13550 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
13560 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
13570 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13580 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
13590 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
135a0 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
135b0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
135c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
135d0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
135e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
135f0 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
13600 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
13610 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
13620 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
13630 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
13640 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
13650 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
13660 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
13670 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
13680 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13690 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
136a0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
136b0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
136c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
136d0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
136e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13700 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13710 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13730 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
13740 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
13750 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
13760 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13770 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
13780 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
13790 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
137a0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
137b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
137c0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
137d0 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
137e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
137f0 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
13800 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
13810 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
13820 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
13830 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
13840 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
13850 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
13860 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
13870 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13880 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
13890 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
138a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
138b0 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
138c0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
138d0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
138e0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
138f0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
13900 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
13910 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
13920 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
13930 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13940 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13950 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
13960 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
13970 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
13980 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13990 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
139a0 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
139b0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
139c0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
139d0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
139e0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
139f0 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
13a00 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
13a10 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
13a20 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
13a30 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
13a40 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
13a50 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13a60 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13a70 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13a80 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a90 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13aa0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13ab0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13ac0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13ad0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13ae0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13af0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13b00 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13b10 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13b20 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13b30 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
13b40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13b50 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13b60 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
13b70 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
13b80 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
13b90 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
13ba0 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
13bb0 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
13bc0 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
13bd0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
13be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
13bf0 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
13c00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13c10 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
13c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13c30 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13c40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13c50 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13c60 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13c70 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13c80 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13c90 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13ca0 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13cb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13cc0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13cd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13ce0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13cf0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13d00 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13d10 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13d20 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13d30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13d40 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13d50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13d60 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
13d90 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
13da0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13db0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13dc0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13dd0 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13de0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13df0 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13e00 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13e10 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13e20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13e30 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13e40 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13e50 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13e60 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13e70 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13e80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13e90 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13ea0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13eb0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13ec0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13ed0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13ee0 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13ef0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13f00 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13f10 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13f20 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13f30 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13f40 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13f50 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13f60 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13f70 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13f80 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13f90 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13fa0 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13fb0 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13fc0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13fd0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13fe0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13ff0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
14000 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
14010 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
14020 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
14030 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
14040 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
14050 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
14060 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
14070 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
14080 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
14090 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
140a0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
140b0 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
140c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
140d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
140e0 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
140f0 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
14100 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
14110 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
14120 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
14130 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
14140 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
14150 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
14160 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
14170 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
14180 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
14190 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
141a0 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
141b0 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
141c0 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
141e0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
141f0 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
14200 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
14210 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
14220 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
14230 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
14240 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14250 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
14260 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
14270 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
14280 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
14290 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
142a0 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
142b0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
142c0 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
142d0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
142e0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
142f0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
14300 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
14310 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
14320 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
14330 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
14340 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
14350 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
14360 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
14370 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14380 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
14390 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
143a0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
143b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
143c0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
143d0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
143e0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
143f0 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
14400 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
14410 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
14420 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
14430 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14440 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
14450 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
14460 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
14470 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
14480 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14490 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
144a0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
144b0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
144c0 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
144d0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
144e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
144f0 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14500 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14510 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
14520 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
14530 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
14540 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
14550 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
14560 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
14570 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
14580 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
14590 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
145a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
145b0 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
145c0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
145d0 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
145e0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
145f0 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
14600 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14610 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
14620 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
14630 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
14640 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
14650 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
14660 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
14670 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
14680 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
14690 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
146a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
146b0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
146c0 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
146d0 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
146e0 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
146f0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
14700 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
14710 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
14720 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
14730 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
14740 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
14750 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
14760 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
14770 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
14780 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
14790 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
147a0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
147b0 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
147c0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
147d0 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
147e0 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
147f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
14800 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14810 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
14820 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
14830 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
14840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14850 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14860 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
14870 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
14880 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
14890 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
148a0 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
148b0 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
148c0 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
148d0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
148e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
148f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
14900 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
14910 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
14920 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14930 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14940 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
14950 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
14960 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
14970 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14980 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
14990 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149a0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
149b0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
149c0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
149d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
149e0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
149f0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
14a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a10 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
14a20 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
14a30 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
14a40 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14a50 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
14a60 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
14a70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14a80 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
14a90 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
14aa0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
14ab0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
14ac0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
14ad0 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
14ae0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
14af0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14b00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14b10 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
14b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14b30 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
14b40 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14b50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14b60 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
14b70 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
14b80 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
14b90 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14ba0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
14bb0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14bc0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14bd0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14be0 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
14bf0 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
14c00 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
14c10 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
14c20 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
14c30 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
14c40 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
14c50 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
14c60 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
14c70 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
14c80 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
14c90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14ca0 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
14cb0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
14cc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
14cd0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
14ce0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14cf0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
14d00 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
14d10 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14d20 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
14d30 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
14d40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14d50 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
14d60 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
14d70 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
14d80 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
14d90 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14da0 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
14db0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
14dc0 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
14dd0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
14de0 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
14df0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
14e00 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
14e10 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
14e20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
14e30 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
14e40 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14e50 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
14e60 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
14e70 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
14e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
14e90 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
14ea0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
14eb0 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
14ec0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14ed0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14ee0 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
14ef0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
14f00 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
14f10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
14f20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14f30 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
14f40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
14f50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14f60 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
14f70 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
14f80 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
14f90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14fa0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
14fb0 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
14fc0 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
14fd0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
14fe0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
14ff0 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
15000 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
15010 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
15020 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
15030 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
15040 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
15050 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
15060 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
15070 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
15080 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
15090 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
150a0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
150b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
150c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
150d0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
150e0 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
150f0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
15100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
15110 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
15120 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
15130 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
15140 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
15150 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15160 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
15170 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
15180 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
15190 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
151a0 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
151d0 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
151e0 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
15210 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
15220 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
15230 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15250 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15260 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
15270 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15280 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
15290 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
152a0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
152b0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
152c0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
152d0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
152e0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
152f0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
15300 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
15310 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
15320 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
15330 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
15340 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
15350 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
15360 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
15370 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
15380 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
15390 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
153a0 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
153b0 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
153c0 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
153d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
153e0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
153f0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
15400 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
15410 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15420 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
15430 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
15440 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
15450 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
15460 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
15470 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15480 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
15490 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
154a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
154b0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
154c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
154d0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
154e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
154f0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
15500 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
15510 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
15520 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
15530 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15540 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
15550 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
15560 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
155c0 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
155d0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
155e0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
155f0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
15600 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
15610 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
15620 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
15630 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
15640 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
15650 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
15660 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
15670 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
15680 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15690 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
156a0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
156b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
156c0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
156d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
156e0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
156f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15700 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15710 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
15720 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
15730 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
15740 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
15750 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
15760 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
15770 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
15780 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
15790 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
157a0 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
157b0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
157c0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
157d0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
157e0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
157f0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
15800 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
15810 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
15820 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
15830 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
15840 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
15850 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
15860 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
15870 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15880 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
15890 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
158a0 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
158b0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
158c0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
158d0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
158e0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
158f0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
15900 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
15910 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
15920 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
15930 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
15940 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15950 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
15960 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
15970 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15980 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
15990 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
159a0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
159b0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
159c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
159d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
159e0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
159f0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
15a00 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
15a10 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
15a20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
15a30 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
15a40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15a50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15a60 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
15a70 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
15a80 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
15a90 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
15aa0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
15ab0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
15ac0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
15ad0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
15ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
15af0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
15b00 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
15b10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15b20 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
15b30 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
15b40 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
15b50 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
15b60 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
15b70 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
15b80 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
15b90 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
15ba0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15bb0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
15bc0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
15bd0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
15be0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15bf0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
15c00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15c10 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
15c20 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
15c30 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
15c40 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
15c50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
15c60 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
15c70 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
15c80 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
15c90 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
15ca0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15cb0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
15cc0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
15cd0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
15ce0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
15cf0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
15d00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15d10 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
15d20 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
15d30 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
15d40 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
15d50 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
15d60 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
15d70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d80 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
15d90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
15da0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
15db0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
15dc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
15dd0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
15de0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
15df0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
15e00 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
15e10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
15e20 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
15e30 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
15e40 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
15e50 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
15e60 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
15e70 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
15e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ea0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
15eb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
15ec0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15ed0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
15ee0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
15ef0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15f00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15f10 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
15f20 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
15f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15f40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15f50 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
15f60 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
15f70 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15f80 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
15f90 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
15fa0 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
15fb0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
15fc0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
15fd0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
15fe0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
15ff0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
16000 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
16010 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
16020 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16030 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
16040 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
16050 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
16060 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
16070 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16080 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
16090 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
160a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
160b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
160c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
160d0 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  /...#ifdef SQLIT
160e0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f  E_ENABLE_STAT3./
160f0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
16100 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
16110 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
16120 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
16130 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
16140 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16150 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
16160 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
16170 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
16180 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
16190 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
161a0 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
161b0 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
161c0 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
161d0 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
161e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
161f0 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
16200 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
16210 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
16220 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
16230 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16240 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16250 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
16260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16270 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
16280 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
16290 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
162a0 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Val,        /* V
162b0 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72  alue to consider
162c0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
162d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
162e0 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
162f0 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
16300 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
16310 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16330 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
16340 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
16350 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64  tRowcnt n;.  Ind
16360 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16370 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70  e;.  int i, eTyp
16380 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20  e;.  int isEq = 
16390 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f  0;.  i64 v;.  do
163a0 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61  uble r, rS;..  a
163b0 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d  ssert( roundUp==
163c0 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20  0 || roundUp==1 
163d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
163e0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
163f0 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20    if( pVal==0 ) 
16400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16410 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d  ROR;.  n = pIdx-
16420 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
16430 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
16440 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65  aSample;.  eType
16450 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16460 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20  _type(pVal);..  
16470 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
16480 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
16490 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
164a0 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a  ue_int64(pVal);.
164b0 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a      r = (i64)v;.
164c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
164d0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
164e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
164f0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16500 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
16510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
16520 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16530 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
16540 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
16550 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16560 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
16570 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69  GER ){.        i
16580 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
16590 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=v ){.        
165a0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
165b0 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20  [i].u.i==v;.    
165c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
165d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
165e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
165f0 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  rt( aSample[i].e
16600 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16610 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AT );.        if
16620 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  ( aSample[i].u.r
16630 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=r ){.         
16640 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16650 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20  i].u.r==r;.     
16660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16670 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16680 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16690 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
166a0 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73  OAT ){.    r = s
166b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
166c0 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66  ble(pVal);.    f
166d0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
166e0 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
166f0 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16700 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16710 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
16720 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  e;.      if( aSa
16730 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
16740 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
16750 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ak;.      if( aS
16760 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16770 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
16780 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61          rS = aSa
16790 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20  mple[i].u.r;.   
167a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167b0 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69    rS = aSample[i
167c0 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  ].u.i;.      }. 
167d0 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29       if( rS>=r )
167e0 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
167f0 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20   rS==r;.        
16800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16810 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16820 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e   eType==SQLITE_N
16830 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30  ULL ){.    i = 0
16840 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c  ;.    if( aSampl
16850 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[0].eType==SQLI
16860 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d  TE_NULL ) isEq =
16870 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16880 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
16890 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
168a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
168b0 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  B );.    for(i=0
168c0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
168d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
168e0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
168f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
16900 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65   || aSample[i].e
16910 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
16920 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  B ){.        bre
16930 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16940 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78  }.    if( i<pIdx
16950 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20  ->nSample ){    
16960 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
16970 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16980 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  b;.      CollSeq
16990 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63   *pColl;.      c
169a0 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20  onst u8 *z;.    
169b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
169c0 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
169d0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
169e0 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
169f0 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
16a00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
16a10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
16a20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
16a30 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
16a40 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
16a50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
16a60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
16a70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53  ollSeq(pParse, S
16a80 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
16a90 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
16aa0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
16ab0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
16ac0 6e 63 65 20 77 61 73 20 75 6e 61 76 61 69 6c 61  nce was unavaila
16ad0 62 6c 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  ble, we should h
16ae0 61 76 65 20 66 61 69 6c 65 64 0a 20 20 20 20 20  ave failed.     
16af0 20 20 20 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20 61     ** long ago a
16b00 6e 64 20 6e 65 76 65 72 20 72 65 61 63 68 65 64  nd never reached
16b10 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 42 75   this point.  Bu
16b20 74 20 77 65 27 6c 6c 20 63 68 65 63 6b 20 6a 75  t we'll check ju
16b30 73 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  st to.        **
16b40 20 62 65 20 64 6f 75 62 6c 79 20 73 75 72 65 2e   be doubly sure.
16b50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16b60 4e 45 56 45 52 28 70 43 6f 6c 6c 3d 3d 30 29 20  NEVER(pColl==0) 
16b70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16b80 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7a  ERROR;.        z
16b90 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
16ba0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
16bb0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
16bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
16bd0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
16be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16bf0 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
16c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
16c10 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
16c20 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
16c30 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
16c40 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
16c50 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
16c60 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
16c70 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16c80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16c90 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
16ca0 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
16cb0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16cc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
16cd0 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
16ce0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16cf0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
16d00 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
16d10 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
16d20 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16d30 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
16d40 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
16d50 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
16d60 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
16d70 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
16d80 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
16d90 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
16da0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
16db0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
16dc0 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
16dd0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
16de0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
16df0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
16e00 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
16e10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16e20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16e30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16e40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16e50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16e60 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
16e70 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16e80 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
16e90 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
16ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16eb0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
16ec0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
16ed0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
16ee0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
16ef0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
16f00 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
16f10 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
16f20 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
16f30 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
16f40 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
16f50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16f60 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
16f70 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16f90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16fa0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16fb0 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
16fc0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
16fd0 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
16fe0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
16ff0 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
17000 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
17010 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
17020 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
17030 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
17040 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
17050 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
17060 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
17070 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
17080 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
17090 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
170a0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
170b0 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
170c0 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
170d0 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
170e0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
170f0 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
17100 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
17110 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
17120 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
17130 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
17140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17150 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
17160 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
17170 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
17180 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
17190 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
171a0 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
171b0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
171c0 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
171d0 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
171e0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
171f0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
17200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17210 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
17220 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
17230 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
17240 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17250 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
17260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
17270 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
17280 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
17290 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
172a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
172b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
172c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
172d0 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
172e0 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
172f0 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17300 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17310 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
17320 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
17330 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17340 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17350 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
17360 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
17370 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
17380 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
17390 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
173a0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
173b0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
173c0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
173d0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
173e0 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
173f0 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17400 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17410 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17420 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
17430 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
17440 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
17450 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
17460 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
17470 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
17480 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
17490 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
174a0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
174b0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
174c0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
174d0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
174e0 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
174f0 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17500 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17510 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
17520 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
17530 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
17540 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
17550 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17560 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17570 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
17580 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
17590 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
175a0 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
175b0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
175c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
175d0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
175e0 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
175f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17600 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17610 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
17620 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
17630 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
17640 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
17650 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
17660 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
17670 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
17680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17690 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
176a0 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
176b0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
176c0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
176d0 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
176e0 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61  prepare, iVar, a
176f0 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ff);.    return 
17700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17710 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17720 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
17730 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
17740 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
17750 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  , pp);.}.#endif.
17760 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17770 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
17780 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
17790 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
177a0 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
177b0 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
177c0 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
177d0 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
177e0 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
177f0 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
17800 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
17810 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
17820 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
17830 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
17840 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
17850 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
17860 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
17870 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
17880 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
17890 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
178a0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
178b0 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
178c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
178d0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
178e0 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
178f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17900 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
17910 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
17960 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
17970 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
17980 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
17990 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
179a0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
179b0 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
179c0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
179d0 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
179e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70  .**.** The nEq p
179f0 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
17a00 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
17a10 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
17a20 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a   subject to the.
17a30 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
17a40 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
17a50 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
17a60 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
17a70 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74  nstraints.** opt
17a80 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
17a90 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
17aa0 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
17ab0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
17ac0 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20   is.** on t1(a, 
17ad0 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
17ae0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
17af0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
17b00 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
17b10 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
17b20 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
17b30 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
17b40 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61  d the value 1 (a
17b50 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
17b60 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a  ricted column,.*
17b70 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  * b, is the seco
17b80 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  nd left-most col
17b90 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
17ba0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
17bb0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
17bc0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17bd0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17be0 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
17bf0 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
17c00 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  assed 0..**.** T
17c10 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
17c20 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
17c30 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63  divisor to reduc
17c40 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a  e the estimated.
17c50 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e  ** search space.
17c60 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
17c70 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74   of 1 means that
17c80 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17c90 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c  ts are.** no hel
17ca0 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74  p at all.  A ret
17cb0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  urn value of 2 m
17cc0 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74  eans range const
17cd0 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78  raints are.** ex
17ce0 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65  pected to reduce
17cf0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17d00 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20  e by half.  And 
17d10 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a  so forth....**.*
17d20 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
17d30 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
17d40 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65   ANALYZE data, e
17d50 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17d60 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20  lity.** reduces 
17d70 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
17d80 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
17d90 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  4.  Hence a sing
17da0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
17db0 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
17dc0 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20  n a return of 4 
17dd0 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
17de0 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
17df0 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
17e00 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31  in a return of 1
17e10 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
17e20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
17e30 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17e40 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17e50 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17e60 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17e70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17e90 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
17ea0 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
17eb0 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
17ec0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
17ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
17ee0 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
17ef0 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
17f00 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
17f10 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
17f20 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
17f30 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
17f40 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
17f50 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
17f60 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17f70 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
17f80 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
17f90 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
17fa0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
17fb0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  L */.  WhereCost
17fc0 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a 20 4f   *pRangeDiv /* O
17fd0 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63  UT: Reduce searc
17fe0 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20  h space by this 
17ff0 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20  divisor */.){.  
18000 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18010 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
18020 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18030 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
18040 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 4f   p->nSample && O
18050 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
18060 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
18070 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b 0a  QLITE_Stat3) ){.
18080 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
18090 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20  e *pRangeVal;.  
180a0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
180b0 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
180c0 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
180d0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
180e0 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
180f0 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
18100 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
18110 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
18120 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
18130 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
18140 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
18150 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
18160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
18170 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
18180 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
18190 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
181a0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65    assert( (pLowe
181b0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
181c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
181d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
181e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
181f0 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
18200 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
18210 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d  RangeVal, 0, a)=
18220 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
18230 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
18240 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
18250 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e     if( (pLower->
18260 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
18270 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b  T)!=0 ) iLower +
18280 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
18290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
182a0 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
182b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
182c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
182d0 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
182e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
182f0 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
18300 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
18310 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
18320 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
18330 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
18340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
18350 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18360 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
18370 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
18380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18390 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
183a0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
183b0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31   p, pRangeVal, 1
183c0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
183d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
183e0 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a   iUpper = a[0];.
183f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 70          if( (pUp
18400 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
18410 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70   WO_LE)!=0 ) iUp
18420 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  per += a[1];.   
18430 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18440 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
18450 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
18460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
18480 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20 77  reCost iBase = w
18490 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52 6f  hereCost(p->aiRo
184a0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
184b0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
184c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 61  r ){.        iBa
184d0 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74 28  se -= whereCost(
184e0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
184f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18500 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42 61  *pRangeDiv = iBa
18510 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  se;.      WHERET
18520 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
18530 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
18540 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 64  : %u..%u  div=%d
18550 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
18570 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
18580 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44  iUpper, *pRangeD
18590 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  iv));.      retu
185a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
185b0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
185c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
185d0 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
185e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
185f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18600 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66  TER(nEq);.#endif
18610 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
18620 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
18630 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30 3b   *pRangeDiv = 0;
18640 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
18650 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
18660 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
18670 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
18680 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
18690 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
186a0 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
186b0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
186c0 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
186d0 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  */.  if( pLower 
186e0 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
186f0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
18700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 61  )==0 ){.    *pRa
18710 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61  ngeDiv += 20;  a
18720 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
18730 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
18740 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
18750 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
18760 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
18770 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
18780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18790 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
187a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
187b0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
187c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
187d0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
187e0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
187f0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
18800 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
18810 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
18820 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
18830 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
18840 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
18850 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
18860 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
18870 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
18880 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
18890 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
188a0 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
188b0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
188c0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
188d0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
188e0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
188f0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
18900 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
18910 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
18920 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
18930 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18940 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18960 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18970 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
18980 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
18990 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
189a0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
189b0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
189c0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
189d0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
189e0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
189f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
18a00 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18a10 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18a20 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18a30 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18a40 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18a50 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18a60 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18a70 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18a80 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18a90 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
18aa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18ab0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
18ac0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18ad0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18ae0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18af0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18b00 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18b20 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
18b30 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
18b40 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
18b50 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18b60 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18b70 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
18b80 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
18b90 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
18ba0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
18bb0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
18bc0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
18bd0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
18be0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
18bf0 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
18c00 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
18c10 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
18c20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
18c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18c40 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
18c50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18c70 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18c80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
18c90 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
18ca0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
18cb0 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
18cc0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18ce0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
18cf0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
18d00 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
18d10 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
18d20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
18d30 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
18d40 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18d50 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
18d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
18d70 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
18d80 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
18d90 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
18da0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18db0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
18dc0 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
18dd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18de0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
18df0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18e00 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
18e10 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
18e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e30 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18e40 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  00,("equality sc
18e50 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
18e60 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
18e70 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
18e80 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
18e90 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18ea0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18eb0 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18ec0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18ed0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18ee0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18ef0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
18f00 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18f10 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18f30 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18f40 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18f50 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
18f60 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
18f70 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
18f80 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
18f90 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
18fa0 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
18fb0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
18fc0 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
18fd0 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
18fe0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
18ff0 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
19000 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
19010 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
19020 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
19030 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
19040 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
19050 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19060 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19070 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19080 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
19090 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
190a0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
190b0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
190c0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
190d0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
190e0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
190f0 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
19100 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
19110 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
19120 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
19130 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
19140 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
19150 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19160 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19170 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19180 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19190 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
191a0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
191b0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
191c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
191d0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
191e0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
191f0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
19200 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19210 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
19220 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
19230 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
19240 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
19250 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
19260 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19270 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19280 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19290 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
192a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
192b0 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
192c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
192d0 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
192e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
192f0 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
19300 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
19310 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
19320 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
19330 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
19340 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
19350 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
19360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19370 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
19380 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19390 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
193a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
193b0 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
193c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
193d0 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
193e0 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
193f0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
19400 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
19410 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
19420 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
19430 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
19440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19450 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19460 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19470 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
19480 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
19490 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
194a0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
194b0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28  ERETRACE(0x100,(
194c0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
194d0 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
194e0 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65  wEst));.  }.  re
194f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19500 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
19510 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
19520 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ) */../*.** Disa
19530 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
19540 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
19550 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
19560 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
19570 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
19580 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
19590 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
195a0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
195b0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
195c0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
195d0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
195e0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
195f0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
19600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
19610 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
19620 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
19630 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
19640 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
19650 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
19660 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
19670 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
19680 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
19690 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
196a0 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
196b0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
196c0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
196d0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
196e0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
196f0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
19700 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
19710 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
19720 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
19730 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
19740 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
19750 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
19760 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
19770 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
19780 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
19790 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
197a0 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  bled..**.** IMPL
197b0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
197c0 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20  -24597-58655 No 
197d0 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66  tests are done f
197e0 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  or terms that ar
197f0 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e.** completely 
19800 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
19810 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ices..**.** Disa
19820 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
19830 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
19840 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
19850 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
19860 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
19870 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
19880 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
19890 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
198a0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
198b0 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
198c0 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
198d0 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
198e0 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
198f0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
19900 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
19910 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
19920 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
19930 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
19940 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
19950 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
19960 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
19970 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
19980 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
19990 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
199a0 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
199b0 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
199c0 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
199d0 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
199e0 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
199f0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
19a00 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
19a10 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19a20 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
19a30 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
19a40 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
19a50 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19a60 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19a70 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19a80 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19a90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19aa0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19ab0 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19ac0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19ad0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19ae0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
19af0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
19b00 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
19b10 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
19b20 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
19b30 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
19b40 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
19b50 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
19b60 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19b70 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19b90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19ba0 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19bb0 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19bc0 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19bd0 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
19be0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
19bf0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
19c00 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
19c10 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19c20 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
19c30 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
19c40 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
19c50 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
19c60 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19c70 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19c80 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19c90 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19ca0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19cb0 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19cc0 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
19ce0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
19cf0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
19d00 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
19d10 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
19d20 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
19d30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19d40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19d50 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
19d60 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19d70 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19d80 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19d90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19da0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19db0 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19dc0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19dd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19de0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
19df0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
19e00 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
19e10 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
19e20 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
19e30 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
19e40 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
19e50 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
19e60 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19e70 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19e80 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19e90 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19ea0 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19eb0 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19ec0 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19ed0 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19ee0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19ef0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19f00 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
19f10 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
19f20 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
19f30 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
19f40 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
19f50 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
19f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f70 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19f80 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19fa0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19fb0 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19fc0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19fd0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19fe0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19ff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1a000 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
1a010 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
1a020 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1a030 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
1a040 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
1a050 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
1a060 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
1a070 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
1a080 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
1a090 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
1a0a0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
1a0b0 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
1a0c0 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
1a0d0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
1a0e0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
1a0f0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
1a100 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
1a110 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
1a120 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
1a130 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
1a140 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
1a150 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
1a160 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
1a170 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
1a180 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
1a190 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
1a1a0 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
1a1b0 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
1a1c0 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
1a1d0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
1a1e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
1a1f0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1a200 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a210 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
1a220 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
1a230 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1a240 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1a250 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1a260 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
1a270 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1a280 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
1a290 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
1a2a0 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
1a2b0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
1a2c0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
1a2d0 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
1a2e0 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
1a2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a300 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
1a310 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
1a320 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
1a330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
1a340 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
1a350 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
1a360 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
1a370 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
1a380 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
1a390 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1a3a0 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3c0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
1a3d0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
1a3e0 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
1a3f0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
1a400 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
1a410 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1a420 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a430 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1a440 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
1a450 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
1a460 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
1a470 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
1a480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a490 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1a4a0 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
1a4b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a4c0 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
1a4d0 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
1a4e0 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
1a4f0 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
1a500 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
1a510 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
1a520 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
1a530 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1a540 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a550 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1a560 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
1a570 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1a580 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a590 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a5a0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
1a5b0 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
1a5c0 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
1a5d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a5e0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
1a5f0 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
1a600 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a610 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
1a620 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
1a630 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
1a640 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1a650 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
1a660 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
1a670 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a680 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
1a690 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
1a6a0 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
1a6b0 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
1a6c0 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
1a6d0 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
1a6e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1a6f0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1a700 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
1a710 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1a720 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a730 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1a740 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  )==0 );.    pLoo
1a750 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
1a760 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20  ERE_IN_ABLE;.   
1a770 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
1a780 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
1a790 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
1a7a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1a7b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1a7c0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
1a7d0 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
1a7e0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1a7f0 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
1a800 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1a810 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1a820 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a830 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
1a860 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
1a870 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
1a880 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
1a890 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a8a0 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
1a8b0 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
1a8c0 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
1a8d0 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
1a8e0 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
1a8f0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1a900 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
1a920 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
1a930 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a940 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1a950 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
1a960 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a970 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a990 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1a9a0 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
1a9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a9c0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
1a9d0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1a9e0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  OP_Next;.      s
1a9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1aa00 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
1aa10 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
1aa20 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
1aa30 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
1aa40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1aa50 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1aa60 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
1aa70 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1aa80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1aa90 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1aaa0 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
1aab0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
1aac0 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  or an.** index..
1aad0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1aae0 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
1aaf0 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
1ab00 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
1ab10 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
1ab20 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
1ab30 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
1ab40 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
1ab50 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
1ab60 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
1ab70 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
1ab80 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
1ab90 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
1aba0 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
1abb0 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
1abc0 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
1abd0 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
1abe0 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
1abf0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
1ac00 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1ac10 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
1ac20 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
1ac30 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
1ac40 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
1ac50 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1ac60 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
1ac70 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
1ac80 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1ac90 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
1aca0 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
1acb0 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
1acc0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
1acd0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1ace0 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
1acf0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
1ad00 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
1ad10 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
1ad20 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
1ad30 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
1ad40 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
1ad50 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
1ad60 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
1ad70 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
1ad80 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
1ad90 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
1ada0 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
1adb0 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
1adc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1add0 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
1ade0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
1adf0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74  ory cell and ret
1ae00 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
1ae10 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  x of that memory
1ae20 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20   cell. The code 
1ae30 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
1ae40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1ae50 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
1ae60 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68  cell to store th
1ae70 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
1ae80 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
1ae90 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
1aea0 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
1aeb0 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
1aec0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1aed0 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
1aee0 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
1aef0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
1af00 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
1af10 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
1af20 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
1af30 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1af40 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1af50 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
1af60 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
1af70 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
1af80 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
1af90 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
1afa0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1afb0 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
1afc0 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
1afd0 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
1afe0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
1aff0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1b000 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45  ts that use NONE
1b010 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65   affinity are se
1b020 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  t to.** SQLITE_A
1b030 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73  FF_NONE. This is
1b040 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51   to deal with SQ
1b050 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  L such as the fo
1b060 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1b070 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1b080 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  (a TEXT PRIMARY 
1b090 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45  KEY, b);.**   SE
1b0a0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1b0b0 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45   AS t2, t1 WHERE
1b0c0 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a   t1.a = t2.b;.**
1b0d0 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1b0e0 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e  le above, the in
1b0f0 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73  dex on t1(a) has
1b100 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
1b110 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65  But since.** the
1b120 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   right hand side
1b130 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
1b140 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e   constraint (t2.
1b150 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69  b) has NONE affi
1b160 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76  nity,.** no conv
1b170 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ersion should be
1b180 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72   attempted befor
1b190 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76  e using a t2.b v
1b1a0 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a  alue as part of.
1b1b0 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72  ** a key to sear
1b1c0 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65  ch the index. He
1b1d0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79  nce the first by
1b1e0 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  te in the return
1b1f0 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  ed affinity.** s
1b200 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78  tring in this ex
1b210 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73  ample would be s
1b220 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46  et to SQLITE_AFF
1b230 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _NONE..*/.static
1b240 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61   int codeAllEqua
1b250 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
1b260 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1b270 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1b280 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1b290 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1b2a0 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
1b2b0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
1b2c0 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
1b2d0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b2f0 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1b300 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
1b310 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1b320 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1b330 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1b340 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1b350 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1b360 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1b370 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1b380 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1b390 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1b3a0 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3c0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1b3d0 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1b3e0 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1b3f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b400 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1b410 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1b420 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1b430 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b450 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1b460 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1b470 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
1b480 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1b490 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1b4a0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1b4b0 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
1b4c0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1b4d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1b4e0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1b4f0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b520 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1b530 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b540 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1b550 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1b560 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1b570 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b580 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1b590 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1b5a0 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5c0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1b5d0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1b5e0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1b5f0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1b600 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1b610 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1b620 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
1b630 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1b640 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
1b650 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b660 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1b670 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
1b680 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1b690 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1b6a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1b6b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
1b6c0 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
1b6d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1b6e0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1b6f0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1b700 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1b710 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1b720 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1b730 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
1b740 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
1b750 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1b760 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1b770 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1b780 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1b790 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1b7a0 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1b7b0 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1b7c0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1b7d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b7e0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1b7f0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1b800 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1b810 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1b820 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
1b830 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
1b840 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1b850 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1b860 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1b870 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1b880 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1b890 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1b8a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1b8b0 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1b8c0 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1b8d0 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1b8e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1b8f0 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1b900 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1b910 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1b920 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1b930 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1b940 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1b950 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b960 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1b970 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b980 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1b990 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1b9a0 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
1b9b0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1b9c0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1b9d0 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b  , bRev, regBase+
1b9e0 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1b9f0 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1ba00 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1ba10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ba20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ba30 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1ba40 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1ba50 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1ba60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ba70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ba80 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1ba90 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1baa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1bab0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1bac0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1bad0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1bae0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1baf0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1bb00 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1bb10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1bb20 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1bb30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1bb40 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1bb50 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1bb60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bb70 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
1bb80 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
1bb90 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
1bba0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1bbb0 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20  if( zAff ){.    
1bbc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1bbd0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1bbe0 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d  Right, zAff[j])=
1bbf0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1bc00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1bc10 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1bc20 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1bc30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1bc40 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1bc50 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1bc60 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
1bc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1bc80 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1bc90 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1bca0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bcb0 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20  .  }.  *pzAff = 
1bcc0 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  zAff;.  return r
1bcd0 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64  egBase;.}..#ifnd
1bce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
1bcf0 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  XPLAIN./*.** Thi
1bd00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
1bd10 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69  elper for explai
1bd20 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65  nIndexRange() be
1bd30 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68  low.**.** pStr h
1bd40 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66  olds the text of
1bd50 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1bd60 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64  hat we are build
1bd70 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a  ing up one term.
1bd80 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  ** at a time.  T
1bd90 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1bda0 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
1bdb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78  he end of the ex
1bdc0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72  pression..** Ter
1bdd0 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64  ms are separated
1bde0 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74   by AND so add t
1bdf0 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f  he "AND" text fo
1be00 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  r second and sub
1be10 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73  sequent.** terms
1be20 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
1be30 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70   void explainApp
1be40 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63  endTerm(.  StrAc
1be50 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20  cum *pStr,      
1be60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
1be70 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  xt expression be
1be80 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69  ing built */.  i
1be90 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20  nt iTerm,       
1bea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1beb0 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d  dex of this term
1bec0 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f  .  First is zero
1bed0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1bee0 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20   *zColumn,      
1bef0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1bf00 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1bf10 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20  st char *zOp    
1bf20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1bf30 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1bf40 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65   */.){.  if( iTe
1bf50 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  rm ) sqlite3StrA
1bf60 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1bf70 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
1bf80 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1bf90 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c  ppend(pStr, zCol
1bfa0 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69  umn, -1);.  sqli
1bfb0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1bfc0 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
1bfd0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bfe0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
1bff0 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
1c000 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
1c010 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
1c020 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
1c030 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
1c040 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1c050 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
1c060 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
1c070 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1c080 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
1c090 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
1c0a0 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
1c0b0 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
1c0c0 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
1c0d0 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
1c0e0 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
1c0f0 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
1c100 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
1c110 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c120 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1c130 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
1c140 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1c150 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
1c160 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
1c170 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
1c180 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
1c190 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
1c1a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1c1b0 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
1c1c0 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
1c1d0 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
1c1e0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1c1f0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c200 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
1c210 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
1c220 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
1c230 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1c240 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1c250 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
1c260 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
1c270 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
1c280 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
1c290 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
1c2a0 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
1c2b0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
1c2c0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
1c2d0 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
1c2e0 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
1c2f0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1c300 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
1c310 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1c320 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1c330 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
1c340 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->aCol;.  int
1c350 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
1c360 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
1c370 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
1c380 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1c390 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1c3a0 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
1c3b0 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1c3c0 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
1c3d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
1c3e0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
1c3f0 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
1c400 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1c410 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
1c420 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1c430 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1c440 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
1c450 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
1c460 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
1c470 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
1c480 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
1c490 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a  ]].zName, "=");.
1c4a0 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
1c4b0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1c4c0 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1c4d0 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
1c4e0 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
1c4f0 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1c500 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1c510 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
1c520 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1c530 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
1c540 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
1c550 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1c560 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
1c570 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
1c580 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
1c590 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
1c5a0 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1c5b0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
1c5c0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1c5d0 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
1c5e0 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
1c5f0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c600 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
1c610 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c620 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1c630 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &txt);.}../*.** 
1c640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c650 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1c660 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
1c670 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
1c680 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
1c690 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
1c6a0 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
1c6b0 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
1c6c0 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
1c6d0 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
1c6e0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1c6f0 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1c700 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1c710 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
1c720 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
1c730 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1c740 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
1c750 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1c760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1c770 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
1c780 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1c790 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1c7a0 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
1c7b0 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
1c7c0 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
1c7d0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
1c7e0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
1c7f0 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
1c800 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
1c810 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
1c840 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
1c850 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
1c860 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c880 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
1c890 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
1c8a0 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
1c8b0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
1c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1c8d0 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
1c8e0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1c8f0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
1c900 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
1c910 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1c920 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c930 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1c940 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1c950 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1c960 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1c970 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1c980 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1c990 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c9a0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1c9b0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1c9c0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1c9d0 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
1c9e0 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
1c9f0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
1ca00 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
1ca10 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
1ca20 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
1ca30 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
1ca40 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
1ca50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
1ca60 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
1ca70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1ca80 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
1ca90 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
1caa0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1cab0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1cac0 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
1cad0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
1cae0 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
1caf0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1cb00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1cb10 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
1cb20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
1cb30 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1cb40 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
1cb50 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
1cb60 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
1cb70 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
1cb80 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
1cb90 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
1cba0 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
1cbb0 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
1cbc0 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
1cbd0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1cbe0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1cc00 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
1cc10 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
1cc20 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
1cc30 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
1cc40 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
1cc50 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
1cc60 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
1cc70 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
1cc80 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1cc90 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
1cca0 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
1ccb0 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
1ccc0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1ccd0 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
1cce0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1ccf0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1cd00 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
1cd10 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
1cd20 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
1cd30 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1cd40 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1cd50 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
1cd60 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
1cd70 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1cd80 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
1cd90 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
1cda0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cdb0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cdc0 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
1cdd0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
1cde0 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
1cdf0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
1ce00 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
1ce10 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
1ce20 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
1ce30 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1ce40 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
1ce50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
1ce60 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
1ce70 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70  xRange(db, pLoop
1ce80 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1ce90 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cea0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1ceb0 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
1cec0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
1ced0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
1cee0 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) ? .           
1cef0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
1cf00 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e  G AUTOMATIC %sIN
1cf10 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20  DEX%.0s%s" :.   
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45  "%s USING %sINDE
1cf40 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20  X %s%s"), .     
1cf50 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20            zMsg, 
1cf60 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
1cf70 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56  IDX_ONLY) ? "COV
1cf80 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20  ERING " : ""),. 
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1cfa0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1cfb0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65  dex->zName, zWhe
1cfc0 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
1cfd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
1cfe0 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
1cff0 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
1d000 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
1d010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
1d020 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
1d030 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d040 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d050 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
1d060 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1d070 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20  KEY", zMsg);..  
1d080 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 28 57      if( flags&(W
1d090 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
1d0a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20  HERE_COLUMN_IN) 
1d0b0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1d0c0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1d0d0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1d0e0 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
1d0f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1d100 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
1d110 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
1d120 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
1d130 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1d140 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d150 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1d160 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
1d170 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
1d180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1d190 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1d1a0 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1d1b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d1c0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d1d0 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
1d1e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1d1f0 65 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61  e if( ALWAYS(fla
1d200 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
1d210 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IT) ){.        z
1d220 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d230 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d240 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
1d250 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
1d260 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d270 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d280 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
1d290 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
1d2a0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1d2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1d2c0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d2d0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d2e0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1d2f0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
1d300 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1d310 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
1d320 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70  ab.idxNum, pLoop
1d330 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
1d340 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1d350 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1d360 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1d370 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b  sg, "%s", zMsg);
1d380 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d390 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
1d3a0 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
1d3b0 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l, iFrom, zMsg, 
1d3c0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1d3d0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1d3e0 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
1d3f0 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
1d400 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1d410 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
1d420 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d430 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
1d440 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
1d450 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
1d460 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
1d470 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
1d480 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
1d490 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
1d4a0 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
1d4b0 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
1d4c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
1d4d0 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
1d4e0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1d4f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d500 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
1d510 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
1d520 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
1d530 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
1d540 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  coded */.  Bitma
1d550 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
1d560 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
1d570 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
1d580 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
1d590 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
1d5a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d5b0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1d5c0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1d5d0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1d5e0 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
1d5f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
1d600 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
1d610 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
1d620 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
1d630 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
1d640 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
1d650 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1d660 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
1d670 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
1d680 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
1d690 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d6a0 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
1d6b0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1d6c0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1d6d0 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
1d6e0 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
1d6f0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
1d700 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1d710 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
1d720 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  op object being 
1d730 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1d740 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1d750 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1d760 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
1d770 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1d780 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1d790 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d7a0 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
1d7b0 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
1d7c0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7e0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d7f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d810 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d820 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1d830 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
1d860 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
1d870 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
1d880 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d890 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
1d8a0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
1d8b0 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
1d8c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d8f0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1d900 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
1d910 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d930 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
1d940 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
1d950 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
1d960 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
1d970 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1d980 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
1d990 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
1d9a0 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
1d9b0 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
1d9c0 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
1d9d0 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
1d9e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1d9f0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 65   */.  Bitmask ne
1da00 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  wNotReady;      
1da10 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1da20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1da30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1da40 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
1da50 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  be;.  pWC = &pWI
1da60 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d  nfo->sWC;.  db =
1da70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
1da80 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
1da90 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c  >a[iLevel];.  pL
1daa0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
1dab0 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d  Loop;.  pTabItem
1dac0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
1dad0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1dae0 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
1daf0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1db00 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57  or;.  bRev = (pW
1db10 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69  Info->revMask>>i
1db20 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74  Level)&1;.  omit
1db30 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
1db40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1db50 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
1db60 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1db70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1db80 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1db90 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e  BLE)==0;.  VdbeN
1dba0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1dbb0 42 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20  Begin Join Loop 
1dbc0 25 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a  %d", iLevel));..
1dbd0 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1dbe0 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
1dbf0 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
1dc00 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
1dc10 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
1dc20 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
1dc30 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
1dc40 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
1dc50 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
1dc60 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
1dc70 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
1dc80 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
1dc90 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
1dca0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
1dcb0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
1dcc0 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
1dcd0 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
1dce0 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
1dcf0 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
1dd00 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1dd10 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
1dd20 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
1dd30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
1dd40 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
1dd50 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
1dd60 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
1dd70 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
1dd80 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
1dd90 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
1dda0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1ddb0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1ddc0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1ddd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dde0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
1ddf0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
1de00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1de10 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
1de20 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
1de30 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
1de40 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1de50 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
1de60 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
1de70 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
1de80 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
1de90 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
1dea0 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1deb0 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
1dec0 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
1ded0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
1dee0 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
1def0 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
1df00 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1df10 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
1df20 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
1df30 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1df40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1df50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
1df60 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1df70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1df80 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
1df90 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
1dfa0 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20  flag"));.  }..  
1dfb0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
1dfc0 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1dfd0 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d   subquery implem
1dfe0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
1dff0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70  utine */.  if( p
1e000 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
1e010 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
1e020 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
1e030 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
1e040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1e060 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e  eger, pTabItem->
1e070 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72  addrFillSub-1, r
1e080 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c  egYield);.    pL
1e090 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69  evel->p2 =  sqli
1e0a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1e0b0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69   OP_Yield, regYi
1e0c0 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eld);.    VdbeCo
1e0d0 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1e0e0 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e  row of co-routin
1e0f0 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d  e %s", pTabItem-
1e100 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1e110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
1e130 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72  regYield+1, addr
1e140 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
1e150 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  ->op = OP_Goto;.
1e160 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1e170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e180 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
1e190 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1e1a0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1e1b0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1e1c0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65   /* Case 1:  The
1e1d0 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
1e1e0 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
1e1f0 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
1e200 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
1e210 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
1e220 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
1e230 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
1e240 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
1e250 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
1e260 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f     int addrNotFo
1e270 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  und;.    int nCo
1e280 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70  nstraint = pLoop
1e290 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73  ->nLTerm;..    s
1e2a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1e2b0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1e2c0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
1e2d0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e2e0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
1e2f0 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46  2);.    addrNotF
1e300 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
1e310 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28  ddrBrk;.    for(
1e320 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
1e330 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
1e340 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52  int iTarget = iR
1e350 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54  eg+j+2;.      pT
1e360 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1e370 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
1e380 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
1e390 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1e3a0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e3b0 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
1e3c0 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74       codeEqualit
1e3d0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
1e3e0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
1e3f0 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a  bRev, iTarget);.
1e400 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46          addrNotF
1e410 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
1e420 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65  ddrNxt;.      }e
1e430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e440 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e450 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
1e460 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  r->pRight, iTarg
1e470 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
1e480 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1e490 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e4a0 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75  nteger, pLoop->u
1e4b0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52  .vtab.idxNum, iR
1e4c0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1e4d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e4e0 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74  _Integer, nConst
1e4f0 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a  raint, iReg+1);.
1e500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e510 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
1e520 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  ter, iCur, addrN
1e530 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20  otFound, iReg,. 
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
1e560 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  ab.idxStr,.     
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
1e590 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52  eedFree ? P4_MPR
1e5a0 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
1e5b0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1e5c0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1e5d0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1e5e0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1e5f0 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1e600 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1e610 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1e620 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1e630 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1e640 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1e650 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1e660 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1e670 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1e680 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1e690 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1e6a0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1e6b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1e6c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1e6d0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1e6e0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1e6f0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1e700 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e710 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1e720 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1e730 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1e740 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1e750 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1e760 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1e770 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f  K)!=0.   && (pLo
1e780 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
1e790 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1e7a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29  HERE_COLUMN_EQ))
1e7b0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1e7c0 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20  Case 2:  We can 
1e7d0 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
1e7e0 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
1e7f0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
1e800 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
1e810 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1e820 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1e830 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
1e840 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
1e850 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
1e860 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
1e870 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
1e880 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
1e890 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
1e8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
1e8b0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  p->u.btree.nEq==
1e8c0 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73  1 );.    iReleas
1e8d0 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
1e8e0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1e8f0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1e900 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1e910 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1e920 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1e930 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1e940 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1e950 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1e960 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e970 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1e980 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1e990 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
1e9a0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52  -11662 */.    iR
1e9b0 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
1e9c0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1e9d0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1e9e0 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65  , 0, bRev, iRele
1e9f0 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
1ea00 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1ea10 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
1ea20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ea30 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
1ea40 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
1ea50 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1ea60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ea70 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1ea80 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1ea90 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1eaa0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1eab0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1eac0 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a   iRowidReg, 1);.
1ead0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1eae0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1eaf0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1eb00 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
1eb10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1eb20 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
1eb30 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
1eb40 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70  }else if( (pLoop
1eb50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1eb60 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20  E_IPK)!=0.      
1eb70 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1eb80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1eb90 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20  LUMN_RANGE)!=0. 
1eba0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1ebb0 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  3:  We have an i
1ebc0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
1ebd0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1ebe0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
1ebf0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
1ec00 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
1ec10 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
1ec20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
1ec30 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
1ec40 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
1ec50 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
1ec60 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1ec70 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
1ec80 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d   pStart = pEnd =
1ec90 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   0;.    if( pLoo
1eca0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ecb0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70  RE_BTM_LIMIT ) p
1ecc0 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
1ecd0 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1ece0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ecf0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1ed00 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c  IMIT ) pEnd = pL
1ed10 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1ed20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1ed30 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
1ed40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52  =0 );.    if( bR
1ed50 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  ev ){.      pTer
1ed60 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
1ed70 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
1ed80 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54  .      pEnd = pT
1ed90 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  erm;.    }.    i
1eda0 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1edb0 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
1edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1edd0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1ede0 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
1edf0 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
1ee00 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
1ee10 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1ee20 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
1ee30 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
1ee40 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ry */..      /* 
1ee50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1ee60 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78  nstant maps TK_x
1ee70 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72  x codes into cor
1ee80 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20  responding .    
1ee90 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65    ** seek opcode
1eea0 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f  s.  It depends o
1eeb0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  n a particular o
1eec0 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78  rdering of TK_xx
1eed0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1eee0 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70  const u8 aMoveOp
1eef0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
1ef00 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
1ef10 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20  P_SeekGt,.      
1ef20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f       /* TK_LE */
1ef30 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20    OP_SeekLe,.   
1ef40 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54          /* TK_LT
1ef50 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a   */  OP_SeekLt,.
1ef60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1ef70 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GE */  OP_SeekG
1ef80 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  e.      };.     
1ef90 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
1efa0 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20  TK_GT+1 );      
1efb0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1efc0 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20   ordering.. */. 
1efd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1efe0 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20  LT==TK_GT+2 );  
1eff0 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74      /*  ... of t
1f000 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e  he TK_xx values.
1f010 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1f020 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54  rt( TK_GE==TK_GT
1f030 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +3 );      /*  .
1f040 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20  .. is correcct. 
1f050 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
1f060 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  ( (pStart->wtFla
1f070 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1f080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f090 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
1f0a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1f0b0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
1f0c0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
1f0d0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1f0e0 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1f0f0 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1f100 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f110 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
1f120 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1f130 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
1f140 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1f150 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f160 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f170 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1f180 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1f190 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f1a0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1f1b0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1f1c0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1f1d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1f1e0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1f1f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f200 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1f210 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1f220 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1f230 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1f240 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1f250 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f260 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1f270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f290 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1f2a0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1f2b0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1f2c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f2d0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1f2e0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
1f2f0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
1f300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1f310 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1f320 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61  rt( (pEnd->wtFla
1f330 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1f340 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f350 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66  tcase( pEnd->lef
1f360 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b  tCursor!=iCur );
1f370 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63   /* Transitive c
1f380 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
1f390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1f3a0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f3b0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
1f3c0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
1f3d0 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
1f3e0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1f3f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1f400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f410 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1f420 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1f430 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1f440 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1f450 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1f460 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1f470 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1f480 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1f490 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1f4a0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1f4b0 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1f4c0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f4d0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1f4e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1f4f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f500 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f510 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f520 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1f530 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1f540 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1f550 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f560 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1f570 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1f580 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1f590 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1f5a0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1f5b0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1f5c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1f5d0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1f5e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f5f0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1f600 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1f610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f620 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1f630 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1f640 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1f650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f660 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1f670 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1f680 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1f690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f6a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1f6b0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1f6c0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1f6d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1f6e0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1f6f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1f700 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1f710 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1f720 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1f730 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f740 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1f750 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1f760 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1f770 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1f780 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1f790 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1f7a0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1f7b0 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1f7c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1f7d0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1f7e0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1f7f0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1f800 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f810 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f820 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1f830 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1f840 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1f850 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1f860 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1f870 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1f880 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1f890 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1f8a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1f8b0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1f8c0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1f8d0 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1f8e0 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1f8f0 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1f900 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1f910 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1f920 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1f930 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1f940 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1f950 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1f960 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1f970 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1f980 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f990 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1f9a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1f9b0 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1f9c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f9d0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f9f0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1fa00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fa10 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1fa20 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1fa30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1fa40 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1fa50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1fa60 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1fa70 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1fa80 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1fa90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1faa0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1fab0 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1fac0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1fad0 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1fae0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1faf0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1fb00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1fb10 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1fb20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fb30 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1fb40 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1fb50 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1fb60 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1fb70 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1fb80 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1fb90 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1fba0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1fbb0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1fbc0 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1fbd0 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1fbe0 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1fbf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1fc00 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1fc10 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1fc20 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1fc30 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1fc40 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1fc50 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1fc60 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1fc70 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1fc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1fc90 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1fca0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1fcb0 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1fcc0 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1fcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1fce0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1fcf0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1fd00 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1fd10 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
1fd20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1fd30 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fd40 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1fd50 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1fd60 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
1fd70 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1fd80 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fd90 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1fda0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1fdb0 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
1fdc0 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1fdd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1fde0 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1fdf0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1fe00 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
1fe10 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1fe20 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1fe30 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1fe40 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1fe50 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1fe60 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1fe70 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1fe80 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1fe90 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1fea0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1feb0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1fec0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1fed0 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1fee0 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff00 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1ff10 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1ff20 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1ff30 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1ff40 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d  ree.nEq;  /* Num
1ff50 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1ff60 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
1ff70 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ff90 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
1ffa0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
1ffb0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
1ffc0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1ffe0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1fff0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
20000 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
20010 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
20020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
20030 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
20040 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
20050 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
20060 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
20070 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
20080 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
20090 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
200a0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
200b0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
200c0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
200d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
200e0 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
200f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20100 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
20110 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
20120 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
20150 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
20160 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
20170 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
20180 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
20190 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
201a0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
201b0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
201c0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
201d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
201e0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
201f0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
20200 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
20210 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
20220 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
20230 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
20240 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
20250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
20260 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
20270 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
20280 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
20290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
202a0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
202b0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
202c0 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
202f0 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
20300 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20320 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
20330 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
20340 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
20350 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
20360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
20370 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
20380 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
20390 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
203a0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
203b0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
203c0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
203d0 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20  IdxCur;..    /* 
203e0 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
203f0 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
20400 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
20410 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
20420 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
20430 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
20440 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
20450 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
20460 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
20470 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
20480 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
20490 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
204a0 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
204b0 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
204c0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
204d0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
204e0 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
204f0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
20500 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
20510 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
20520 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
20530 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
20540 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
20550 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20560 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
20570 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
20580 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
20590 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
205a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57    */.    if( (pW
205b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
205c0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
205d0 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  IN)!=0.     && (
205e0 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
205f0 30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  0).     && (pIdx
20600 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
20610 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
20620 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
20630 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
20640 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
20650 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
20660 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
20670 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
20680 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
20690 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
206a0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
206b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
206c0 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
206d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
206e0 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
206f0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
20700 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
20710 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
20720 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
20730 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
20740 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
20750 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
20760 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
20770 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
20780 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
20790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
207a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
207b0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
207c0 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
207d0 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
207e0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
207f0 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
20800 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
20810 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
20820 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
20830 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
20840 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
20850 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
20860 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
20870 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
20880 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
20890 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
208a0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
208b0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
208c0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
208d0 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
208e0 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
208f0 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
20900 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
20910 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20920 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
20930 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
20940 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
20950 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
20960 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
20970 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
20980 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
20990 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
209a0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
209b0 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
209c0 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
209d0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
209e0 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
209f0 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
20a00 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
20a10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
20a20 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
20a30 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
20a40 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
20a50 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
20a60 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
20a70 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  && pIdx->nColumn
20a80 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
20a90 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
20aa0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
20ab0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
20ac0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
20ad0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20ae0 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
20af0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20b00 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
20b10 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
20b20 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
20b30 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
20b40 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
20b50 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20b60 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
20b70 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
20b80 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
20b90 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20ba0 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
20bb0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
20bc0 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
20bd0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
20be0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
20bf0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
20c00 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
20c10 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
20c20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
20c30 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
20c40 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
20c50 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
20c60 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
20c70 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
20c80 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
20c90 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
20ca0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
20cb0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
20cc0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
20cd0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
20ce0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
20cf0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
20d00 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
20d10 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
20d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20d30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
20d40 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
20d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
20d60 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
20d70 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
20d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
20d90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
20da0 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
20db0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
20dc0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
20dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
20de0 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
20df0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
20e00 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
20e10 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
20e20 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
20e30 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
20e40 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
20e50 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
20e60 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
20e70 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
20e80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
20e90 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
20ea0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
20eb0 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
20ec0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
20ed0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
20ee0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
20ef0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
20f00 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20f10 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20f30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
20f40 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
20f50 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
20f60 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
20f70 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
20f80 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
20f90 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
20fa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
20fb0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
20fc0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
20fd0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
20fe0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20ff0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
21000 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
21010 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
21020 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
21030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
21050 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
21060 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
21070 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
21080 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
21090 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
210a0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
210b0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
210c0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
210d0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
210e0 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
210f0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
21100 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
21110 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
21120 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
21130 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
21140 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
21150 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
21160 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21170 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
21180 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21190 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
211a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
211b0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
211c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
211d0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
211e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
211f0 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
21200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21210 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
21220 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
21230 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
21240 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
21250 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
21260 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
21270 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
21280 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
21290 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
212a0 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
212b0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
212c0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
212d0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
212e0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
212f0 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
21300 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
21310 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
21320 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
21330 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
21340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21350 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
21360 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
21370 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
21380 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
21390 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
213a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
213b0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
213c0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
213d0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
213e0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
213f0 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20      if( zEndAff 
21400 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
21410 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
21420 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45  inity(pRight, zE
21430 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  ndAff[nEq])==SQL
21440 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
21450 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
21460 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
21470 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
21480 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
21490 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
214a0 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
214b0 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
214c0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
214d0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
214e0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
214f0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
21500 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
21510 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
21520 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
21530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21540 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21550 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
21560 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
21570 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29   zEndAff[nEq]) )
21580 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  {.          zEnd
21590 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
215a0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
215b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
215c0 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
215d0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
215e0 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
215f0 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20  zEndAff);.      
21600 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
21610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21620 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
21630 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
21640 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
21650 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
21660 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
21670 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66  ree(db, zStartAf
21680 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
21690 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66  bFree(db, zEndAf
216a0 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
216b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
216c0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
216d0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
216e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
216f0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
21700 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
21710 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
21720 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
21730 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
21740 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
21750 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
21760 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
21770 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
21780 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21790 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
217a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
217b0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
217c0 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
217d0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
217e0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
217f0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
21800 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
21810 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
21820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21830 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
21840 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
21850 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
21860 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
21870 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
21880 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
21890 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
218a0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
218b0 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
218c0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
218d0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
218e0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
218f0 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
21900 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
21910 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
21920 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
21930 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
21940 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21950 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21960 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
21970 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21980 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
21990 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
219a0 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
219b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
219c0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
219d0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
219e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
219f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21a00 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
21a10 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
21a20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21a30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21a40 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
21a50 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
21a60 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21a70 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21a80 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
21a90 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
21aa0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
21ab0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
21ac0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
21ad0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
21ae0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
21af0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
21b00 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
21b10 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
21b20 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
21b30 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
21b40 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
21b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21b60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
21b70 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
21b80 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
21b90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21ba0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
21bb0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
21bc0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
21bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21be0 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
21bf0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
21c00 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
21c10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
21c20 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
21c30 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
21c40 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
21c50 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
21c60 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21c70 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
21c80 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
21c90 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
21ca0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
21cb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21cc0 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20  _ONEROW ){.     
21cd0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21ce0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
21cf0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
21d00 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21d10 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
21d20 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
21d30 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
21d40 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
21d50 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
21d60 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
21d70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21d80 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29  CONSTRAINT)==0 )
21d90 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21da0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
21db0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
21dc0 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
21dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21de0 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
21df0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
21e00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21e10 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
21e20 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  ON.  if( pLoop->
21e30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21e40 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
21e50 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20  /* Case 5:  Two 
21e60 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
21e70 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
21e80 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
21e90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
21ea0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
21eb0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
21ec0 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
21ed0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
21ee0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
21ef0 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
21f00 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
21f10 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
21f20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
21f30 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
21f40 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
21f50 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
21f60 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
21f70 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
21f80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
21f90 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
21fa0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
21fb0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
21fc0 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
21fd0 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
21fe0 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
21ff0 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
22000 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
22010 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
22020 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
22030 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
22040 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
22050 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
22060 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
22070 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
22080 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
22090 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
220a0 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
220b0 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
220c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
220d0 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
220e0 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
220f0 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
22100 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
22110 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
22120 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
22130 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
22140 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
22150 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
22160 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
22170 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
22180 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22190 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
221a0 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
221b0 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
221c0 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
221d0 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
221e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
221f0 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
22200 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
22210 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
22220 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
22230 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
22240 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
22250 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
22260 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
22270 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
22280 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
22290 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
222a0 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
222b0 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
222c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
222d0 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
22300 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
22310 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
22320 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
22330 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
22340 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
22350 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
22360 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
22370 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
22380 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
22390 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
223a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
223b0 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
223d0 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
223e0 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
223f0 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
22400 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
22410 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
22420 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
22430 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
22440 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
22450 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
22460 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
22470 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
22480 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
22490 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
224a0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
224b0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
224c0 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
224d0 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
224e0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
224f0 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
22500 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
22510 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
22520 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
22530 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
22540 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
22550 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
22560 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
22570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
22580 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
22590 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
225a0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
225b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
225c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
225d0 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
225e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
225f0 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22620 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
22630 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
22640 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
22650 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
22660 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
22670 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
22680 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
226b0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
226c0 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
226d0 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
226e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
226f0 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
22700 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
22710 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
22720 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22750 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
22760 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
22770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22780 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
22790 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
227a0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
227b0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
227c0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
227d0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
227e0 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
227f0 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
22800 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
22810 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
22820 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
22830 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
22840 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
22850 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
22860 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
22870 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
22880 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
22890 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
228a0 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
228b0 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
228c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
228d0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
228e0 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
228f0 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
22900 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
22910 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
22920 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
22930 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
22940 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
22950 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
22960 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
22970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22980 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
22990 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
229a0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
229b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
229c0 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
229d0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
229e0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
229f0 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
22a00 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
22a10 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
22a20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
22a30 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
22a40 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
22a50 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
22a60 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
22a70 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
22aa0 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
22ab0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
22ac0 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
22ad0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
22ae0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
22af0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
22b00 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
22b10 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
22b20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
22b30 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
22b40 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
22b50 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
22b60 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
22b70 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
22b80 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
22b90 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
22ba0 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
22bb0 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
22bc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
22bd0 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
22be0 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
22bf0 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
22c00 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
22c10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
22c20 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
22c30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22c50 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
22c60 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
22c70 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
22c80 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
22c90 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
22ca0 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
22cb0 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
22cc0 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
22cd0 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
22ce0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
22cf0 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
22d00 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
22d10 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
22d20 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
22d30 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
22d40 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
22d50 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
22d60 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
22d70 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
22d80 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
22d90 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
22da0 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
22db0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
22dc0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
22dd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
22de0 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
22df0 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
22e00 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
22e10 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
22e20 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
22e30 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
22e40 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
22e50 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
22e60 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
22e70 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
22e80 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
22e90 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
22ea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
22eb0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22ec0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
22ed0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
22ee0 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
22ef0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22f00 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
22f10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22f40 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
22f50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
22f60 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
22f70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22f80 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
22f90 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
22fa0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
22fb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
22fc0 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
22fd0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
22fe0 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
22ff0 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
23000 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
23010 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
23020 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
23030 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
23040 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
23050 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
23060 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
23070 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
23080 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
23090 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
230a0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
230b0 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
230c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
230d0 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
230e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
230f0 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
23100 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
23110 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
23120 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
23130 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
23140 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
23150 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
23160 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
23170 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
23180 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
23190 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
231a0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
231b0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
231c0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
231d0 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
231e0 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
231f0 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
23200 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
23210 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
23220 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
23230 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
23240 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
23250 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
23260 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
23270 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
23280 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
23290 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
232a0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
232b0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
232c0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
232d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
232e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
232f0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
23300 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
23310 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
23320 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
23330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
23340 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23350 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
23360 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23370 20 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61        if( pWC->a
23380 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
23390 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20  & (TERM_ORINFO) 
233a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
233b0 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
233c0 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
233d0 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
233e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
233f0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
23400 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
23410 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
23420 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
23430 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
23440 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
23450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23460 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
23470 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
23480 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
23490 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
234a0 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
234b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
234c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
234d0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
234e0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
234f0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
23500 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
23510 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
23520 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
23530 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
23540 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
23550 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
23560 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
23570 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
23580 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
23590 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
235a0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
235b0 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
235c0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
235d0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
235e0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
235f0 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
23600 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
23610 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
23620 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
23630 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
23640 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
23650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23660 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
23670 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
23680 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
23690 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
236a0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
236b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
236c0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
236d0 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
236e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
236f0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
23700 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
23710 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
23720 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
23730 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
23740 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
23750 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
23760 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
23770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
23780 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
23790 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
237a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
237b0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
237c0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
237d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
237e0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
237f0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
23810 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
23820 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
23830 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
23840 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
23850 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
23860 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
23870 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23880 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
23890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
238a0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
238b0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
238c0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
238d0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
238e0 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
238f0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
23900 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
23910 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
23920 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
23960 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23970 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
23980 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
23990 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
239c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
239d0 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
239e0 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
239f0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
23a00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23a10 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
23a20 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
23a30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
23a40 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
23a50 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
23a60 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
23a70 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
23a80 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
23a90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
23aa0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
23ab0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
23ac0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
23ad0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
23ae0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
23af0 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
23b00 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
23b10 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
23b20 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
23b30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23b40 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
23b50 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23b60 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
23b70 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
23b80 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
23b90 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
23ba0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
23bb0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
23bc0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
23bd0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
23be0 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
23bf0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
23c00 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
23c10 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
23c20 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
23c30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
23c40 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
23c50 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
23c60 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
23c70 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
23c80 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
23c90 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
23ca0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
23cb0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
23cc0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23cd0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
23ce0 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
23cf0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
23d00 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
23d10 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
23d20 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
23d30 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
23d40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
23d50 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
23d60 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
23d70 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
23d80 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
23d90 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
23da0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
23db0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
23dc0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
23dd0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
23de0 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
23df0 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
23e00 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
23e10 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
23e20 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
23e30 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
23e40 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23e50 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
23e60 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
23e70 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
23e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
23e90 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
23ea0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
23eb0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
23ec0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
23ed0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
23ee0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
23ef0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
23f00 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
23f10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23f20 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
23f30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23f40 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
23f50 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
23f60 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
23f70 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23f80 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
23f90 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
23fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23fb0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
23fc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
23fd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
23fe0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
23ff0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
24000 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
24010 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
24020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
24030 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
24040 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
24060 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
24070 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
24080 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
24090 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
240a0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
240b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
240c0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
240d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
240e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
240f0 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
24100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24110 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
24120 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
24130 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
24140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
24160 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
24170 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
24180 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24190 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
241a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
241b0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
241c0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
241d0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
241e0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
241f0 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
24200 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
24210 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
24220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
24230 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
24240 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
24250 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
24260 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
24270 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
24280 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
24290 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
242a0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
242b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
242c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
242d0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
242e0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
242f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
24300 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
24310 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
24320 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
24330 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
24340 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  =1 );.    pLevel
24350 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
24360 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v];.    pLevel->
24370 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
24380 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
24390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
243a0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
243b0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
243c0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
243d0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
243e0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
243f0 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f  TEP;.  }.  newNo
24400 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
24410 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57  y & ~getMask(&pW
24420 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
24430 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
24440 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
24450 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
24460 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
24470 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
24480 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
24490 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
244a0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
244b0 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
244c0 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
244d0 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
244e0 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
244f0 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
24500 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
24510 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
24520 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
24530 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
24540 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
24550 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
24560 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
24570 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
24580 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
24590 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
245a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
245b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
245c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
245d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
245e0 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
245f0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
24600 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
24610 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
24620 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
24630 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24640 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
24650 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24660 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
24670 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
24680 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d  & newNotReady)!=
24690 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
246a0 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
246b0 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
246d0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
246e0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
246f0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
24700 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
24710 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
24720 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
24730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
24740 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
24750 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
24760 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
24770 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
24780 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
24790 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
247a0 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
247b0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
247c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
247d0 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
247e0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
247f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24800 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24810 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
24820 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
24830 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72  code to test for
24840 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61   implied constra
24850 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72  ints based on tr
24860 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20  ansitivity.  ** 
24870 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72  of the "==" oper
24880 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
24890 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
248a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
248b0 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62  tains "t1.a=t2.b
248c0 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22  " and "t2.b=123"
248d0 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
248e0 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c   coding the t1 l
248f0 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c  oop and the t2 l
24900 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20  oop has not yet 
24910 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  coded,.  ** then
24920 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74   we cannot use t
24930 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63  he "t1.a=t2.b" c
24940 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77  onstraint, but w
24950 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20  e can code.  ** 
24960 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e  the implied "t1.
24970 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e  a=123" constrain
24980 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  t..  */.  for(pT
24990 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
249a0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
249b0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
249c0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41    Expr *pE, *pEA
249d0 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  lt;.    WhereTer
249e0 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28  m *pAlt;.    if(
249f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24a00 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
24a10 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
24a20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24a30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24a40 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45  !=(WO_EQUIV|WO_E
24a50 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Q) ) continue;. 
24a60 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
24a70 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
24a80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24a90 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
24aa0 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Join ) continue;
24ab0 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
24ac0 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
24ad0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
24ae0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
24af0 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  Join) );.    ass
24b00 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65  ert( (pTerm->pre
24b10 72 65 71 52 69 67 68 74 20 26 20 6e 65 77 4e 6f  reqRight & newNo
24b20 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
24b30 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72    pAlt = findTer
24b40 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65  m(pWC, iCur, pTe
24b50 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
24b60 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
24b70 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
24b80 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63   if( pAlt==0 ) c
24b90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
24ba0 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26   pAlt->wtFlags &
24bb0 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20   (TERM_CODED) ) 
24bc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65  continue;.    te
24bd0 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
24be0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
24bf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24c00 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
24c10 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
24c20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
24c30 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73  (v, "begin trans
24c40 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
24c50 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d  "));.    pEAlt =
24c60 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
24c70 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
24c80 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69  (*pEAlt));.    i
24c90 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20  f( pEAlt ){.    
24ca0 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74    *pEAlt = *pAlt
24cb0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
24cc0 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45  EAlt->pLeft = pE
24cd0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
24ce0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24cf0 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c  e(pParse, pEAlt,
24d00 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
24d10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
24d20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 63       sqlite3Stac
24d30 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29  kFree(db, pEAlt)
24d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24d50 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
24d60 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
24d70 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
24d80 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
24d90 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
24da0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
24db0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
24dc0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
24dd0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
24de0 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
24df0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
24e00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
24e10 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
24e20 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
24e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24e50 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
24e60 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
24e70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24e80 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
24e90 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
24ea0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
24eb0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
24ec0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24ed0 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
24ee0 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
24ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
24f00 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
24f10 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
24f20 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  AL );  /* IMP: R
24f30 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24f40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24f50 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24f60 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
24f70 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
24f80 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24f90 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
24fa0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
24fb0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
24fc0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
24fd0 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
24fe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24ff0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
25000 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
25010 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
25020 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
25030 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
25040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25050 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25060 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
25070 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
25080 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
25090 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
250a0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
250b0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
250c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
250d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
250e0 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
250f0 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79  turn newNotReady
25100 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
25110 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
25120 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
25130 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
25140 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
25150 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
25160 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
25170 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
25180 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
25190 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  st){.  int nb = 
251a0 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  1+(pTabList->nSr
251b0 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
251c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
251d0 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
251e0 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
251f0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
25200 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
25210 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25220 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
25230 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
25260 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
25270 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
25280 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25290 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
252c0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
252d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
252e0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
252f0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
25300 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
25310 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
25320 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
25330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25340 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  e = p->u.btree.p
25350 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  Index->zName;.  
25360 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
25370 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22   ) zName = "ipk"
25380 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
25390 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
253a0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
253b0 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
253c0 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
253d0 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
253e0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
253f0 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
25400 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
25410 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
25420 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25440 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
25450 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
25460 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
25470 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25480 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
25490 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
254a0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
254b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
254c0 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
254d0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
254e0 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
254f0 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
25500 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
25510 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
25520 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
25530 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
25540 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25550 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
25560 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
25570 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
25580 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
25590 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
255a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
255b0 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
255c0 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
255d0 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73  free(z);.  }.  s
255e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
255f0 66 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22  f(" f %04x N %d"
25600 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
25610 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69  >nLTerm);.  sqli
25620 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25630 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
25640 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
25650 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
25660 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
25670 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
25680 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
25690 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
256a0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
256b0 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
256c0 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
256d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
256e0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
256f0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
25700 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
25710 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
25720 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
25730 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
25740 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
25750 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
25760 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
25770 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
25780 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
25790 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
257a0 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
257b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
257c0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
257d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
257e0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
257f0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
25800 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25810 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
25820 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
25830 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
25840 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
25850 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
25860 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
25870 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25880 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
25890 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
258a0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
258b0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
258c0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
258d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
258e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
258f0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
25900 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25910 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
25920 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25930 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25940 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
25950 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25960 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
25970 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
25980 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
25990 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
259a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
259b0 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
259c0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
259d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
259e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
259f0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
25a00 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25a10 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
25a20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
25a30 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
25a40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
25a50 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
25a60 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
25a70 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
25a80 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
25a90 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
25aa0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
25ab0 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
25ac0 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
25ad0 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
25ae0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25af0 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
25b00 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25b10 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
25b20 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
25b30 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
25b40 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
25b50 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
25b60 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
25b70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
25b80 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
25b90 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
25ba0 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
25bb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25bc0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
25bd0 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
25be0 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
25bf0 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
25c00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
25c10 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
25c20 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
25c30 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
25c40 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
25c50 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
25c60 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
25c70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25c80 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
25c90 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
25ca0 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
25cb0 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
25cc0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
25cd0 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
25ce0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25cf0 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
25d00 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77  *pFrom){.  if( w
25d10 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
25d20 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
25d30 4c 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20  LTerm) ) return 
25d40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25d50 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
25d60 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
25d70 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
25d80 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
25d90 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
25da0 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
25db0 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
25dc0 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
25dd0 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
25de0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
25df0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
25e00 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
25e10 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
25e20 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
25e30 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
25e40 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
25e50 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
25e60 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
25e70 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
25e80 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25ea0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
25eb0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
25ec0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25ed0 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
25ee0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25ef0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
25f00 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
25f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
25f20 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
25f30 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
25f40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
25f50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25f60 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
25f70 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
25f80 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
25f90 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
25fa0 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
25fb0 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
25fc0 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
25fd0 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
25fe0 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
25ff0 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
26000 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
26010 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
26020 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
26030 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
26040 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
26050 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
26060 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
26070 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
26080 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
26090 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
260a0 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
260b0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
260c0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
260d0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
260e0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
260f0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
26100 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
26110 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
26120 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
26130 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
26140 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
26150 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
26160 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
26170 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
26180 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
26190 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
261a0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
261b0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
261c0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
261d0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
261e0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
261f0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
26200 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
26210 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
26220 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
26230 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
26240 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
26250 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
26260 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
26270 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
26280 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
26290 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
262a0 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
262b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
262c0 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
262d0 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
262e0 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
262f0 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
26300 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
26310 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
26320 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
26330 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
26340 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
26350 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
26360 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
26370 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
26380 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
26390 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
263a0 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
263b0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
263c0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
263d0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
263e0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
263f0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
26400 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
26410 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
26420 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
26430 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
26440 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
26450 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
26460 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
26470 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
26480 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
26490 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
264a0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
264b0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
264c0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
264d0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
264e0 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
264f0 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
26500 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
26510 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
26520 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
26530 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
26540 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
26550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
26560 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
26570 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
26580 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
26590 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
265a0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
265b0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
265c0 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
265d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
265e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
265f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26600 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
26610 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
26620 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
26630 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
26640 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
26650 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
26660 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
26670 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
26680 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
26690 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
266a0 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
266b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
266c0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
266d0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
266e0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
266f0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
26700 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26710 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
26720 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
26750 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
26760 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
26770 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
26780 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
26790 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
267a0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
267b0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
267c0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
267d0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
267e0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
267f0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26800 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26820 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
26830 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
26840 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
26850 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
26860 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
26870 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
26880 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
26890 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
268a0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
268b0 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
268c0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
268d0 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
268e0 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
268f0 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
26900 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
26910 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
26920 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
26930 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
26940 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
26950 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
26960 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
26970 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
26980 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
26990 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
269a0 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
269b0 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
269c0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
269d0 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
269e0 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
269f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26a00 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
26a10 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26a20 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
26a30 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
26a40 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
26a50 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
26a60 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
26a70 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
26a80 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
26a90 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
26aa0 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
26ab0 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
26ac0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26ad0 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
26ae0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26af0 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
26b00 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
26b10 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26b20 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
26b30 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
26b40 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
26b50 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
26b60 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
26b70 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
26b80 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
26b90 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
26ba0 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
26bb0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
26bc0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
26bd0 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
26be0 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
26bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26c00 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
26c10 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
26c20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
26c30 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
26c40 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
26c50 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
26c60 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
26c70 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
26c80 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
26c90 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20  ->rRun.    ){.  
26ca0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
26cb0 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20  ch taken when p 
26cc0 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74  is equal or bett
26cd0 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
26ce0 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  e in .      ** a
26cf0 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ll of (1) depend
26d00 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d  ences (2) setup-
26d10 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75  cost, and (3) ru
26d20 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20  n-cost. */.     
26d30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
26d40 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26d50 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69  Setup );.      i
26d60 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65  f( p->nLTerm<pTe
26d70 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20  mplate->nLTerm. 
26d80 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46        && (p->wsF
26d90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26da0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26db0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
26dc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26dd0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
26de0 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e    && p->u.btree.
26df0 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74  pIndex==pTemplat
26e00 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
26e10 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70  x.       && p->p
26e20 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65  rereq==pTemplate
26e30 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29  ->prereq.      )
26e40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65  {.        /* Ove
26e50 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
26e60 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
26e70 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65  h an similar one
26e80 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20   that uses.     
26e90 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73     ** more terms
26ea0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
26eb0 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
26ec0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
26ed0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26ef0 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20     /* pTemplate 
26f00 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a  is not helpful..
26f10 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72          ** Retur
26f20 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  n without changi
26f30 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79  ng or adding any
26f40 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
26f50 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49   goto whereLoopI
26f60 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20  nsert_noop;.    
26f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26f80 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
26f90 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26fa0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
26fb0 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
26fc0 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
26fd0 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c  >rRun.     && AL
26fe0 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d  WAYS(p->rSetup>=
26ff0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
27000 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d  p) /* See SETUP-
27010 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
27020 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
27030 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
27040 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
27050 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
27060 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69   one: one that i
27070 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  s.      ** bette
27080 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20  r at one of (1) 
27090 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29  dependences, (2)
270a0 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20   setup-cost, or 
270b0 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20  (3) run-cost.   
270c0 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20     ** and is no 
270d0 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20  worse in any of 
270e0 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73  those categories
270f0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  . */.      pNext
27100 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
27110 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27120 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
27130 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
27140 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
27150 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
27160 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
27170 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
27180 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
27190 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
271a0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
271b0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
271c0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
271d0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
271e0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
271f0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
27200 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
27210 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
27220 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27230 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27240 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
27250 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
27260 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  nt(p, pWInfo->pT
27270 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
27280 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27290 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20  rintf("ins-new: 
272a0 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
272b0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
272c0 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
272d0 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
272e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
272f0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
27300 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
27310 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
27320 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
27330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27340 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
27350 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
27360 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
27370 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
27380 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
27390 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
273a0 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
273b0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
273c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
273d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
273e0 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
273f0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
27400 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
27410 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
27420 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
27430 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
27440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
27450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
27460 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
27470 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
27480 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
27490 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
274a0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
274b0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
274c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
274d0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c  & 0x8 ){.    sql
274e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
274f0 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20  "ins-noop: ");. 
27500 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
27510 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49  t(pTemplate, pWI
27520 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a  nfo->pTabList);.
27530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
27550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  .}../*.** We hav
27560 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
27570 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
27580 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
27590 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
275a0 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74  pIndex..** Try t
275b0 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
275c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
275d0 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
275e0 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
275f0 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
27600 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
27610 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
27620 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
27630 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
27640 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
27650 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
27660 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
27670 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
27680 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
27690 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
276a0 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
276b0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
276c0 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
276d0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276f0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
27700 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43  pSrc */.  WhereC
27710 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  ost nInMul      
27720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
27730 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
27740 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
27750 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
27760 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
27770 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
27780 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
27790 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
277a0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
277b0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
277c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
277d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
277e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
277f0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
27800 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
27810 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
27820 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
27830 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
27840 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
27850 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
27860 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
27870 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
27880 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
27890 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
278a0 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
278b0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
278c0 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278e0 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
278f0 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
27900 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
27910 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
27920 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
27930 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
27940 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
27950 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
27960 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
27970 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
27980 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
27990 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279b0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
279c0 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
279d0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e  */.  int saved_n
279e0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
279f0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27a00 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27a10 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
27a20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61   u32 saved_wsFla
27a30 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
27a40 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27a50 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c  ue of pNew->wsFl
27a60 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ags */.  WhereCo
27a70 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
27a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27a90 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27aa0 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e  ew->nOut */.  in
27ab0 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ad0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
27ae0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
27af0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
27b00 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27b10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27b20 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65   code */.  Where
27b30 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20  Cost nRowEst;   
27b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
27b50 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65  timated index se
27b60 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57  lectivity */.  W
27b70 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a  hereCost rLogSiz
27b80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
27b90 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
27ba0 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57  able size */.  W
27bb0 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
27bc0 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f   0, *pBtm = 0; /
27bd0 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  * Top and bottom
27be0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
27bf0 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20  ts */..  pNew = 
27c00 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
27c10 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27c20 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
27c30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
27c40 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
27c50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27c60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
27c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
27c80 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27c90 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
27ca0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
27cb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27cc0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
27cd0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
27ce0 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
27cf0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
27d00 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a  m<=0 || (pSrc->j
27d10 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
27d20 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d  T)!=0 ){.    opM
27d30 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
27d40 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
27d50 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
27d60 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d  se{.    opMask =
27d70 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
27d80 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f  ISNULL|WO_GT|WO_
27d90 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
27da0 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65    }.  if( pProbe
27db0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f  ->bUnordered ) o
27dc0 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54  pMask &= ~(WO_GT
27dd0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
27de0 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  LE);..  assert( 
27df0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27e00 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q<=pProbe->nColu
27e10 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  mn );.  if( pNew
27e20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20  ->u.btree.nEq < 
27e30 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
27e40 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50  ){.    iCol = pP
27e50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
27e60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27e70 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  ];.    nRowEst =
27e80 20 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62   whereCost(pProb
27e90 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77  e->aiRowEst[pNew
27ea0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d  ->u.btree.nEq+1]
27eb0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  );.    if( nRowE
27ec0 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  st==0 && pProbe-
27ed0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
27ee0 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b  e ) nRowEst = 1;
27ef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43  .  }else{.    iC
27f00 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f  ol = -1;.    nRo
27f10 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  wEst = 0;.  }.  
27f20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
27f30 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
27f40 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
27f50 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
27f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f70 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
27f80 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65   pProbe);.  save
27f90 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
27fa0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
27fb0 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
27fc0 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
27fd0 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
27fe0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
27ff0 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
28000 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
28010 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
28020 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  Out;.  pNew->rSe
28030 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53  tup = 0;.  rLogS
28040 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65  ize = estLog(whe
28050 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61  reCost(pProbe->a
28060 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20  iRowEst[0]));.  
28070 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
28080 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
28090 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
280a0 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
280b0 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
280c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
280d0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
280e0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
280f0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 64 65 66 20  ontinue;.#ifdef 
28100 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
28110 41 54 33 0a 20 20 20 20 69 66 28 20 28 70 54 65  AT3.    if( (pTe
28120 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
28130 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 20 26 26 20  RM_VNULL)!=0 && 
28140 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
28150 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
28160 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
28170 3b 20 2f 2a 20 73 6b 69 70 20 49 53 20 4e 4f 54  ; /* skip IS NOT
28180 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
28190 73 20 6f 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  s on a NOT NULL 
281a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d 0a  column */.    }.
281b0 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77 2d  #endif.    pNew-
281c0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
281d0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
281e0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
281f0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
28200 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
28210 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
28220 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
28230 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
28240 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
28250 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
28260 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
28270 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
28280 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
28290 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
282a0 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
282b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
282c0 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
282d0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d  kSelf;.    pNew-
282e0 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65  >rRun = rLogSize
282f0 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f  ; /* Baseline co
28300 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20  st is log2(N).  
28310 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f  Adjustments belo
28320 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  w */.    if( pTe
28330 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28340 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
28350 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
28360 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
28370 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28380 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
28390 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  N;.      if( Exp
283a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
283b0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
283c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
283d0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
283e0 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68  .)":  TUNING: th
283f0 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
28400 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
28410 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
28420 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65  ssert( 46==where
28430 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  Cost(25) );.    
28440 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
28450 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
28460 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
28470 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
28480 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
28490 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
284a0 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
284b0 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 28  nIn = whereCost(
284c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
284d0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
284e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
284f0 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70   += nIn;.      p
28500 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28510 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
28520 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
28530 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
28540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
28550 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28560 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  (WO_EQ) ){.     
28570 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
28580 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
28590 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45  _COLUMN_NULL|WHE
285a0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
285b0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
285c0 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30      || nInMul==0
285d0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
285e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
285f0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
28600 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20    if( iCol<0  . 
28610 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
28620 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
28630 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a  ne && nInMul==0.
28640 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e             && pN
28650 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
28660 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
28670 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
28680 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e       assert( (pN
28690 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
286a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
286b0 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20  0 || iCol<0 );. 
286c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
286d0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
286e0 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EROW;.      }.  
286f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28700 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
28710 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
28720 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20  Est + nInMul;.  
28730 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
28740 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
28750 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20  WO_ISNULL) ){.  
28760 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
28770 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
28780 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e  N_NULL;.      pN
28790 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
287a0 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  +;.      /* TUNI
287b0 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65  NG: IS NULL sele
287c0 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20  cts 2 rows */.  
287d0 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61      nIn = 10;  a
287e0 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72 65  ssert( 10==where
287f0 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  Cost(2) );.     
28800 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
28810 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
28820 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
28830 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28840 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
28850 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
28860 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28870 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54  Operator & WO_GT
28880 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28890 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
288a0 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
288b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
288c0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
288d0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
288e0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
288f0 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
28900 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
28910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28920 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
28930 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
28940 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20  T|WO_LE) );.    
28950 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28960 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28970 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_LT );.      te
28980 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28990 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
289a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
289b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
289c0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
289d0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
289e0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
289f0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
28a00 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28a10 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
28a20 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
28a30 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
28a40 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
28a50 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
28a60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77    }.    if( pNew
28a70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28a80 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
28a90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
28aa0 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20  t nOut and rRun 
28ab0 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20  for STAT3 range 
28ac0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
28ad0 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a  WhereCost rDiv;.
28ae0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
28af0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
28b00 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e  pProbe, pNew->u.
28b10 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20  btree.nEq,.     
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26     pBtm, pTop, &
28b40 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65  rDiv);.      pNe
28b50 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28b60 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73  nOut>rDiv+10 ? s
28b70 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76  aved_nOut - rDiv
28b80 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66   : 10;.    }.#if
28b90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
28ba0 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
28bb0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28bc0 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==1 && pProbe->
28bd0 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 26 26 20  nSample.     && 
28be0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
28bf0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
28c00 53 74 61 74 33 29 20 29 7b 0a 20 20 20 20 20 20  Stat3) ){.      
28c10 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
28c20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
28c30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28c40 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
28c50 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
28c60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28c70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28c80 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
28c90 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28ca0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28cb0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
28cc0 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
28cd0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
28ce0 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e 70  pProbe, pTerm->p
28cf0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
28d00 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
28d10 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
28d20 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
28d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
28d40 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72    !ExprHasProper
28d50 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
28d60 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20   EP_xIsSelect)  
28d70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28d80 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
28d90 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
28da0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
28db0 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
28dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
28dd0 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72  rt( nOut==0 || r
28de0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
28df0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
28e00 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68   pNew->nOut = wh
28e10 65 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20  ereCost(nOut);. 
28e20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
28e30 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
28e40 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
28e50 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
28e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
28e70 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65  Each row involve
28e80 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20  s a step of the 
28e90 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69  index, then a bi
28ea0 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20  nary search of. 
28eb0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e       ** the main
28ec0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
28ed0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68  pNew->rRun =  wh
28ee0 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d  ereCostAdd(pNew-
28ef0 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e  >rRun, rLogSize>
28f00 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37  27 ? rLogSize-17
28f10 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20   : 10);.    }.  
28f20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66    /* Step cost f
28f30 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72  or each output r
28f40 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  ow */.    pNew->
28f50 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
28f60 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
28f70 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
28f80 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20   /* TBD: Adjust 
28f90 6e 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f  nOut for additio
28fa0 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nal constraints 
28fb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  */.    rc = wher
28fc0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
28fd0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
28fe0 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
28ff0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
29000 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
29010 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
29020 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<(pProbe->nCo
29030 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e  lumn + (pProbe->
29040 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29  zName!=0)).    )
29050 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
29060 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
29070 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
29080 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
29090 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
290a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
290b0 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
290c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
290d0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
290e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
290f0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
29100 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
29110 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
29120 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
29130 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72  _nLTerm;.  retur
29140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29150 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
29160 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
29170 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
29180 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
29190 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
291a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
291b0 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
291c0 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
291d0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
291e0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
291f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29200 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
29210 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
29220 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
29230 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
29240 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
29250 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
29260 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
29270 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
29280 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
29290 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
292a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
292b0 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
292c0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
292d0 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
292e0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
292f0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
29300 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
29310 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
29320 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
29330 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
29340 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
29350 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
29360 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
29370 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
29380 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
29390 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
293a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
293b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
293c0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
293d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
293e0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66  ursor ){.      f
293f0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
29400 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b  ex->nColumn; jj+
29410 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29420 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
29430 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
29440 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
29450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29460 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29470 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
29480 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
29490 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
294a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
294b0 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
294c0 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
294d0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
294e0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
294f0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
29500 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
29510 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
29520 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
29530 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
29540 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
29550 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
29560 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
29570 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
29580 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
29590 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  n[j];.    testca
295a0 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
295b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
295c0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66  =BMS-2 );.    if
295d0 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
295e0 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d   MASKBIT(x);.  }
295f0 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
29600 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
29610 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
29620 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
29630 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
29640 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
29650 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
29660 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
29670 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
29680 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
29690 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
296a0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
296b0 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
296c0 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
296d0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
296e0 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
296f0 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pTerm;.  for(i=0
29700 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
29710 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
29720 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
29730 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
29740 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72  ImpliesExpr(pTer
29750 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65  m->pExpr, pWhere
29760 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
29770 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
29780 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
29790 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
297a0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
297b0 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
297c0 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
297d0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
297e0 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
297f0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
29800 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
29810 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
29820 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
29830 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
29840 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
29850 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
29860 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
29870 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
29880 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
29890 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
298a0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
298b0 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
298c0 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
298d0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
298e0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
298f0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
29900 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
29910 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
29920 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
29930 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29950 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
29960 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
29970 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
29980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29990 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
299a0 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
299b0 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77  ry key */.  tRow
299c0 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  cnt aiRowEstPk[2
299d0 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ];      /* The a
299e0 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20  iRowEst[] value 
299f0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
29a00 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c  x */.  int aiCol
29a10 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
29a20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
29a30 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
29a40 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
29a50 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29a60 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
29a70 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
29a80 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
29a90 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
29aa0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
29ab0 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
29ac0 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
29ad0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
29ae0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
29af0 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
29b00 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
29b10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
29b20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29b30 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
29b40 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
29b50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
29b60 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
29b90 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68  an value */.  Wh
29ba0 65 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20  ereCost rSize;  
29bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
29bc0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
29bd0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
29be0 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65  ereCost rLogSize
29bf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67  ;         /* Log
29c00 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
29c10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
29c20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
29c30 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
29c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29c50 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
29c60 6c 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e  lause */.  .  pN
29c70 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
29c80 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
29c90 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
29ca0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
29cb0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
29cc0 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
29cd0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
29ce0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
29cf0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
29d00 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
29d10 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
29d20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
29d30 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
29d40 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29d50 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
29d60 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
29d70 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
29d80 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
29d90 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
29da0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
29db0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29dc0 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
29dd0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
29de0 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
29df0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
29e00 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
29e10 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
29e20 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
29e30 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
29e40 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
29e50 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
29e60 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
29e70 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
29e80 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
29e90 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
29ea0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ec0 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
29ed0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
29ee0 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
29ef0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
29f00 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
29f10 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
29f20 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
29f30 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
29f40 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
29f50 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
29f60 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
29f70 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
29f80 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53   sPk.pTable = pS
29f90 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69  rc->pTab;.    ai
29fa0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53  RowEstPk[0] = pS
29fb0 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
29fc0 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
29fd0 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
29fe0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
29ff0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
2a000 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
2a010 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
2a020 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
2a030 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
2a040 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
2a050 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
2a060 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
2a070 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
2a080 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
2a090 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2a0a0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
2a0b0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
2a0c0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
2a0d0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77  .  }.  rSize = w
2a0e0 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70  hereCost(pSrc->p
2a0f0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20  Tab->nRowEst);. 
2a100 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
2a110 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  og(rSize);..  /*
2a120 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
2a130 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
2a140 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20  ilder->pOrSet.  
2a150 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
2a160 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
2a170 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
2a180 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
2a190 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
2a1a0 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
2a1b0 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
2a1c0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
2a1d0 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
2a1e0 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
2a1f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
2a200 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
2a210 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
2a220 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
2a230 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
2a240 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2a250 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
2a260 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
2a270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a280 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
2a290 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
2a2a0 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
2a2b0 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
2a2c0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
2a2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
2a2e0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
2a2f0 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
2a300 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2a310 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
2a320 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2a330 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
2a340 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a350 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
2a360 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2a370 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2a380 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2a390 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
2a3a0 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
2a3b0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2a3c0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70  is.        ** ap
2a3d0 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a  proximately 7*N*
2a3e0 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
2a3f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a400 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
2a410 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
2a420 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a  ing indexed. */.
2a430 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
2a440 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
2a450 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61  + rSize + 28;  a
2a460 73 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65  ssert( 28==where
2a470 43 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20  Cost(7) );.     
2a480 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
2a490 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
2a4a0 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
2a4b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
2a4c0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
2a4d0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
2a4e0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
2a4f0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
2a500 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
2a510 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69      ** of knowni
2a520 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
2a530 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
2a540 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
2a550 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
2a560 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
2a570 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
2a580 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
2a590 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
2a5a0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2a5b0 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
2a5c0 3d 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29  =whereCost(20) )
2a5d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a5e0 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
2a5f0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
2a600 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
2a610 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a620 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
2a630 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
2a640 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2a650 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
2a660 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2a670 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2a680 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2a690 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2a6a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f    }.  }..  /* Lo
2a6b0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
2a6c0 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
2a6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a6e0 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
2a6f0 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
2a700 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
2a710 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
2a720 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
2a730 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
2a740 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
2a750 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
2a760 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2a770 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
2a780 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
2a790 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
2a7a0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
2a7b0 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
2a7c0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
2a7d0 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
2a7e0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2a7f0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
2a800 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
2a810 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2a820 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2a830 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2a840 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2a850 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
2a860 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2a870 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
2a880 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2a890 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
2a8a0 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
2a8b0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
2a8c0 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
2a8d0 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
2a8e0 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
2a8f0 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
2a900 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2a910 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2a920 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a930 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2a940 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
2a950 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2a960 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
2a970 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
2a980 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
2a990 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a9a0 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
2a9b0 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
2a9c0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
2a9d0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2a9e0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2a9f0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2aa00 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
2aa10 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a  table scan is 3*
2aa20 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
2aa30 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
2aa40 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69  extra 3 factor i
2aa50 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
2aa60 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
2aa70 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
2aa80 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c  **     over full
2aa90 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c   scans.  A small
2aaa0 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73  er constant 2 is
2aab0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69   used for coveri
2aac0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ng.      **     
2aad0 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74  index scans so t
2aae0 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69  hat a covering i
2aaf0 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62  ndex scan will b
2ab00 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20  e favored over. 
2ab10 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61       **     a ta
2ab20 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ble scan. */.   
2ab30 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2ab40 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69  whereCostAdd(rSi
2ab50 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31  ze,rLogSize) + 1
2ab60 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  6;.      rc = wh
2ab70 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2ab80 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2ab90 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2aba0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
2abb0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
2abc0 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
2abd0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
2abe0 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
2abf0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2ac00 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
2ac10 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
2ac20 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
2ac30 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20  _INDEXED;..     
2ac40 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
2ac50 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
2ac60 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
2ac70 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
2ac80 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
2ac90 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2aca0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2acb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2acc0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2acd0 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
2ace0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
2acf0 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
2ad00 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
2ad10 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
2ad20 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2ad30 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
2ad40 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
2ad50 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
2ad60 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2ad70 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
2ad80 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69  x : 0;.        i
2ad90 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
2ada0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2adb0 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69  Cost of a coveri
2adc0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  ng index scan is
2add0 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29   2*(N + log2(N))
2ade0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  ..          **  
2adf0 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66  +  The extra 2 f
2ae00 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
2ae10 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
2ae20 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
2ae30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2ae40 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61    over index sca
2ae50 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61  ns.  A table sca
2ae60 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20  n uses a factor 
2ae70 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20  of 3 so that.   
2ae80 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2ae90 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61  dex scans are fa
2aea0 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65  vored over table
2aeb0 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20   scans..        
2aec0 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73    **  +  If this
2aed0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2aee0 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20  might also help 
2aef0 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
2af00 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a  R BY.          *
2af10 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68  *     clause, th
2af20 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66  en the cost is f
2af30 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68  udged down sligh
2af40 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73  tly so that this
2af50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2af60 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72    index is favor
2af70 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69  ed above other i
2af80 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65  ndices that have
2af90 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20   no hope of.    
2afa0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c        **     hel
2afb0 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52  ping with the OR
2afc0 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20  DER BY. */.     
2afd0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2afe0 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74  = 10 + whereCost
2aff0 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
2b000 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20  ze) - b;.       
2b010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b020 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29    assert( b!=0 )
2b030 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ; .          /* 
2b040 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2b050 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63  scanning a non-c
2b060 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73  overing index is
2b070 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20   (N+1)*log2(N). 
2b080 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63           ** whic
2b090 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69  h we will simpli
2b0a0 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67  fy to just N*log
2b0b0 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  2(N) */.        
2b0c0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
2b0d0 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b  Size + rLogSize;
2b0e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b0f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2b100 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2b110 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2b120 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2b130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b140 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2b150 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2b160 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2b170 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Probe, 0);..    
2b180 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2b190 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2b1a0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
2b1b0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
2b1c0 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
2b1d0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2b1e0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
2b1f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2b200 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2b210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2b220 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
2b230 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2b240 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2b250 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
2b260 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
2b270 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
2b280 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2b290 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2b2a0 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
2b2b0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
2b2c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2b2d0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
2b2e0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2b2f0 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20   *pBuilder   /* 
2b300 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2b310 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  ormation */.){. 
2b320 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2b330 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
2b340 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
2b350 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
2b360 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2b370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b380 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2b390 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2b3a0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2b3b0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2b3c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2b3d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b3e0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
2b3f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2b400 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2b410 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
2b420 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
2b430 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
2b440 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
2b450 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2b460 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
2b470 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
2b480 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2b490 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
2b4a0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
2b4b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2b4c0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2b4d0 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
2b4e0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
2b4f0 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
2b500 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b510 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
2b520 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
2b530 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
2b540 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
2b550 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b560 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
2b570 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
2b580 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
2b590 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b5a0 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
2b5b0 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
2b5c0 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
2b5d0 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
2b5e0 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
2b5f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b600 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2b610 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2b620 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2b630 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2b640 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
2b650 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2b660 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2b670 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
2b680 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
2b690 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
2b6a0 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
2b6b0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
2b6c0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
2b6d0 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
2b6e0 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
2b6f0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
2b700 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
2b710 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
2b720 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
2b730 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2b740 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
2b750 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
2b760 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2b770 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b780 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
2b790 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
2b7a0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
2b7b0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2b7c0 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
2b7d0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
2b7e0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
2b7f0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
2b800 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2b810 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
2b820 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2b830 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
2b840 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2b850 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2b860 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
2b870 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b880 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
2b890 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
2b8a0 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
2b8b0 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
2b8c0 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
2b8d0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
2b8e0 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
2b8f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2b900 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
2b910 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
2b920 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
2b930 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2b940 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2b950 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2b960 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2b970 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b980 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2b990 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2b9a0 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
2b9b0 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
2b9c0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
2b9d0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2b9e0 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
2b9f0 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
2ba00 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
2ba10 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2ba20 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
2ba30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2ba40 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2ba50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2ba60 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2ba70 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2ba80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2ba90 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
2baa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bab0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2bac0 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
2bad0 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
2bae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2baf0 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
2bb00 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2bb10 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
2bb20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2bb30 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2bb40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bb60 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
2bb70 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
2bb80 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
2bb90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2bba0 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2bbb0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2bbc0 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
2bbd0 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
2bbe0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bbf0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
2bc00 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
2bc10 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
2bc20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bc30 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
2bc40 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2bc50 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2bc60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2bc70 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
2bc80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bc90 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
2bca0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
2bcb0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2bcc0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
2bcd0 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
2bce0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2bcf0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2bd00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bd10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
2bd20 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
2bd30 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
2bd40 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
2bd50 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
2bd60 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
2bd70 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
2bd80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
2bd90 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
2bda0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2bdb0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2bdc0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
2bdd0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2bde0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2bdf0 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
2be00 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2be10 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
2be20 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2be30 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
2be40 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
2be50 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74  e)2;.    rc = vt
2be60 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
2be70 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
2be80 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fo);.    if( rc 
2be90 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70  ) goto whereLoop
2bea0 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2beb0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2bec0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2bed0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2bee0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2bef0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65  straint;.    pNe
2bf00 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2bf10 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
2bf20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2bf30 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
2bf40 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
2bf50 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2bf60 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
2bf70 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
2bf80 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2bf90 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
2bfa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2bfb0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2bfc0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2bfd0 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
2bfe0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
2bff0 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
2c000 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2c010 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2c020 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2c030 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
2c040 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
2c050 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
2c060 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
2c070 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
2c080 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
2c090 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c0a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2c0b0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
2c0c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2c0d0 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
2c0e0 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
2c0f0 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
2c100 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2c110 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2c120 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
2c130 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2c140 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
2c150 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
2c160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c170 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
2c180 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
2c190 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
2c1a0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2c1b0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
2c1c0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
2c1d0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2c1e0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2c1f0 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
2c200 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2c210 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2c220 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
2c230 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2c240 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
2c250 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
2c260 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2c270 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
2c280 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2c290 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
2c2a0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2c2b0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2c2c0 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2c2d0 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2c2e0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2c2f0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2c300 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2c310 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c320 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2c330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c340 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2c350 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2c360 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2c370 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2c380 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2c390 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2c3a0 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2c3b0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2c3c0 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2c3e0 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2c3f0 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2c400 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2c410 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2c420 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2c430 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2c440 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2c450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c470 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2c480 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2c490 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2c4a0 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2c4b0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2c4c0 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2c4d0 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2c4e0 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2c4f0 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2c500 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2c510 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2c520 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2c530 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2c540 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2c550 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2c560 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2c570 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2c580 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2c590 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2c5a0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2c5b0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2c5c0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2c5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c5e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2c5f0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2c600 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2c610 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2c620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2c630 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2c640 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2c650 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2c660 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2c670 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2c680 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c690 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2c6a0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2c6b0 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2c6c0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2c6d0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2c6e0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2c6f0 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2c700 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2c710 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2c720 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64  ered = (u8)((pId
2c730 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
2c740 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c760 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2c770 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2c780 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e  sumed);.      pN
2c790 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2c7a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2c7b0 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d   = whereCostFrom
2c7c0 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2c7d0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2c7e0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2c7f0 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20  : Every virtual 
2c800 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75  table query retu
2c810 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
2c820 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2c830 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
2c840 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
2c850 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   );.      whereL
2c860 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2c870 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2c880 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
2c890 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
2c8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c8b0 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
2c8c0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
2c8d0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2c8e0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
2c8f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
2c900 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61  .whereLoopAddVta
2c910 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49  b_exit:.  if( pI
2c920 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2c930 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
2c940 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
2c950 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
2c960 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c970 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  IdxInfo);.  retu
2c980 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2c990 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2c9a0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2c9b0 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
2c9c0 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
2c9d0 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
2c9e0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
2c9f0 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
2ca00 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
2ca10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2ca20 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
2ca30 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2ca40 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74  r *pBuilder, Bit
2ca50 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20  mask mExtra){.  
2ca60 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2ca70 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2ca80 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
2ca90 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
2caa0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
2cab0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2cac0 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
2cad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cae0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
2caf0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
2cb00 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
2cb10 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
2cb20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75    WhereOrSet sSu
2cb30 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a  m, sCur, sPrev;.
2cb40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2cb50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2cb60 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2cb70 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57  r->pWC;.  if( pW
2cb80 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2cb90 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
2cba0 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
2cbb0 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
2cbc0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
2cbd0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
2cbe0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 0a  Builder->pNew;..
2cbf0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
2cc00 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
2cc10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2cc20 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
2cc30 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2cc40 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2cc50 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
2cc60 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
2cc70 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
2cc80 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
2cc90 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
2cca0 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
2ccb0 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
2ccc0 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
2ccd0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
2cce0 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
2ccf0 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
2cd00 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
2cd10 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
2cd20 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
2cd30 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
2cd40 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
2cd50 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66     pItem = pWInf
2cd60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
2cd70 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 20   pNew->iTab;.   
2cd80 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d     iCur = pItem-
2cd90 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2cda0 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
2cdb0 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
2cdc0 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
2cdd0 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
2cde0 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
2cdf0 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Cur;..      for(
2ce00 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
2ce10 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45  ; pOrTerm<pOrWCE
2ce20 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  nd; pOrTerm++){.
2ce30 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
2ce40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2ce50 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
2ce60 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
2ce70 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
2ce80 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
2ce90 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
2cea0 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
2ceb0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
2cec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
2ced0 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43  pWC.pWInfo = pWC
2cee0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20  ->pWInfo;.      
2cef0 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65      tempWC.pOute
2cf00 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
2cf10 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
2cf20 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
2cf30 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
2cf40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  1;.          tem
2cf50 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
2cf60 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2cf70 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
2cf80 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
2cf90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
2cfa0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
2cfb0 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20  .        sCur.n 
2cfc0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
2cfd0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2cfe0 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
2cff0 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2d000 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2d010 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d020 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
2d030 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20  sSubBuild);.    
2d040 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2d050 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73 43  <sCur.n; i++) sC
2d060 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ur.a[i].prereq |
2d070 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = mExtra;.      
2d080 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2d090 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2d0a0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2d0b0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
2d0c0 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2d0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d0e0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2d0f0 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
2d100 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2d110 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
2d120 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2d130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2d150 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
2d160 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2d170 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
2d180 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2d190 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
2d1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d1b0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2d1c0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
2d1d0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
2d1e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
2d1f0 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
2d200 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2d210 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2d220 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
2d230 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2d240 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
2d250 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
2d260 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
2d270 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
2d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d290 20 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28     whereCostAdd(
2d2a0 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
2d2b0 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
2d2c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2d2e0 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65 76  ereCostAdd(sPrev
2d2f0 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
2d300 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
2d310 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d330 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2d340 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
2d350 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
2d360 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2d370 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2d380 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
2d390 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
2d3a0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2d3b0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2d3c0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
2d3d0 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
2d3e0 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
2d3f0 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
2d400 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2d410 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
2d420 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
2d430 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65  TUNING: Multiple
2d440 20 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65 20   by 3.5 for the 
2d450 73 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65 20  secondary table 
2d460 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20  lookup */.      
2d470 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2d480 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
2d490 31 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  18;.        pNew
2d4a0 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
2d4b0 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
2d4c0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2d4d0 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
2d4e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2d4f0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2d500 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2d510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d520 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d530 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
2d540 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2d550 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
2d560 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2d570 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
2d580 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2d590 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
2d5a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2d5b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2d5c0 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
2d5d0 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74  Extra = 0;.  Bit
2d5e0 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
2d5f0 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
2d600 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2d610 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2d620 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
2d630 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2d640 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
2d650 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2d660 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61  e->db;.  int nTa
2d670 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2d680 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63  nLevel;.  int rc
2d690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d6a0 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  u8 priorJoinType
2d6b0 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f   = 0;.  WhereLoo
2d6c0 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c  p *pNew;..  /* L
2d6d0 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
2d6e0 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
2d6f0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
2d700 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ght */.  pNew = 
2d710 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2d720 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2d730 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61  pNew);.  for(iTa
2d740 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c  b=0, pItem=pTabL
2d750 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61  ist->a; iTab<nTa
2d760 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70  bList; iTab++, p
2d770 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65  Item++){.    pNe
2d780 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a  w->iTab = iTab;.
2d790 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65      pNew->maskSe
2d7a0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
2d7b0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
2d7c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2d7d0 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
2d7e0 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  ->jointype|prior
2d7f0 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f  JoinType) & (JT_
2d800 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2d810 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74  =0 ){.      mExt
2d820 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20  ra = mPrior;.   
2d830 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e   }.    priorJoin
2d840 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f  Type = pItem->jo
2d850 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  intype;.    if( 
2d860 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
2d870 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2d880 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2d890 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
2d8a0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2d8b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d8c0 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
2d8d0 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2d8e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2d8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d900 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d910 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
2d920 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2d930 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
2d940 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
2d950 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
2d960 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2d970 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65  break;.  }.  whe
2d980 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
2d990 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
2d9a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
2d9b0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
2d9c0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
2d9d0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
2d9e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
2d9f0 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
2da00 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
2da10 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
2da20 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2da30 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
2da40 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
2da50 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
2da60 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
2da70 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a  ation.  Return:.
2da80 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52  ** .**    0:  OR
2da90 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61  DER BY is not sa
2daa0 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e  tisfied.  Sortin
2dab0 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20  g required.**   
2dac0 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73   1:  ORDER BY is
2dad0 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20   satisfied.     
2dae0 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a   Omit sorting.**
2daf0 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20     -1:  Unknown 
2db00 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a  at this time.**.
2db10 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f  ** Note that pro
2db20 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52  cessing for WHER
2db30 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48  E_GROUPBY and WH
2db40 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69  ERE_DISTINCTBY i
2db50 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69  s not as.** stri
2db60 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20  ct.  With GROUP 
2db70 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
2db80 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  the only require
2db90 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20  ment is that.** 
2dba0 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
2dbb0 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65  appear immediate
2dbc0 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f  ly adjacent to o
2dbd0 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f  ne another.  GRO
2dbe0 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53  UP BY.** and DIS
2dbf0 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75  TINT do not requ
2dc00 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65  ire rows to appe
2dc10 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63  ar in any partic
2dc20 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f  ular order as lo
2dc30 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c  ng.** as equivel
2dc40 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f  ent rows are gro
2dc50 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20  uped together.  
2dc60 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42  Thus for GROUP B
2dc70 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a  Y and DISTINCT.*
2dc80 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74  * the pOrderBy t
2dc90 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63  erms can be matc
2dca0 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72  hed in any order
2dcb0 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59  .  With ORDER BY
2dcc0 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72  , the .** pOrder
2dcd0 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65  By terms must be
2dce0 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69   matched in stri
2dcf0 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74  ct left-to-right
2dd00 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2dd10 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
2dd20 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
2dd30 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2dd40 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
2dd50 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2dd60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
2dd70 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52  erBy,   /* ORDER
2dd80 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
2dd90 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75  or DISTINCT clau
2dda0 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  se to check */. 
2ddb0 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74   WherePath *pPat
2ddc0 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  h,     /* The Wh
2ddd0 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b  erePath to check
2dde0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
2ddf0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d  lags,       /* M
2de00 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45  ight contain WHE
2de10 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48  RE_GROUPBY or WH
2de20 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a  ERE_DISTINCTBY *
2de30 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
2de40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2de50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2de60 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
2de70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2de80 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
2de90 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
2dea0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
2deb0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
2dec0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
2ded0 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
2dee0 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
2def0 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
2df00 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
2df10 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
2df20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2df30 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
2df40 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2df60 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
2df70 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
2df80 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
2df90 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
2dfa0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
2dfb0 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
2dfc0 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
2dfd0 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
2dfe0 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
2dff0 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
2e000 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
2e010 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
2e020 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
2e030 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
2e040 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
2e050 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
2e060 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
2e070 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e080 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  e */.  u16 nColu
2e090 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2e0a0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2e0b0 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
2e0c0 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
2e0d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e0e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
2e0f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2e100 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2e110 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2e120 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
2e130 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
2e140 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
2e150 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2e160 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2e170 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
2e180 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2e190 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2e1a0 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
2e1b0 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
2e1c0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2e1d0 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
2e1e0 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
2e1f0 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
2e200 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
2e210 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
2e220 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
2e230 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
2e240 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
2e250 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
2e260 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
2e270 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2e280 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
2e290 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
2e2a0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
2e2b0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2e2c0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
2e2d0 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
2e2e0 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
2e2f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2e300 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
2e310 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
2e320 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2e330 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2e340 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
2e350 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2e360 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
2e370 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2e380 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2e390 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
2e3a0 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
2e3b0 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
2e3c0 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
2e3d0 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
2e3e0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2e3f0 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
2e400 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
2e410 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2e420 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
2e430 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
2e440 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
2e450 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
2e460 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2e470 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
2e480 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
2e490 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2e4a0 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
2e4b0 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
2e4c0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
2e4d0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
2e4e0 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
2e4f0 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
2e500 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2e510 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2e520 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
2e530 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
2e540 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
2e550 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
2e560 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
2e570 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
2e580 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
2e590 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
2e5a0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
2e5b0 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
2e5c0 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
2e5d0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2e5e0 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
2e5f0 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
2e600 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
2e610 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
2e620 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2e630 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
2e640 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
2e650 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
2e660 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
2e670 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2e680 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e690 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
2e6a0 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
2e6b0 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
2e6c0 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
2e6d0 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
2e6e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
2e6f0 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
2e700 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
2e710 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
2e720 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
2e730 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
2e740 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
2e750 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
2e760 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
2e770 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
2e780 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
2e790 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
2e7a0 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
2e7b0 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
2e7c0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
2e7d0 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
2e7e0 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
2e7f0 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
2e800 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
2e810 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
2e820 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
2e830 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
2e840 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
2e850 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
2e860 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
2e870 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2e880 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
2e890 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
2e8a0 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
2e8b0 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
2e8c0 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
2e8d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2e8e0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2e8f0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
2e900 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2e910 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
2e920 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
2e930 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
2e940 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c  ;..  /* Sortabil
2e950 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74  ity of virtual t
2e960 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69  ables is determi
2e970 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ned by the xBest
2e980 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a  Index method.  *
2e990 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
2e9a0 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f   table itself */
2e9b0 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73  .  if( pLast->ws
2e9c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2e9d0 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
2e9e0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f    testcase( nLoo
2e9f0 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20  p>0 );  /* True 
2ea00 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  when outer loops
2ea10 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64   are one-row and
2ea20 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20   match .        
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59    ** no ORDER BY
2ea50 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65   terms */.    re
2ea60 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74  turn pLast->u.vt
2ea70 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  ab.isOrdered;.  
2ea80 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  }.  if( nLoop &&
2ea90 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
2eaa0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2eab0 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
2eac0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2ead0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
2eae0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
2eaf0 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
2eb00 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
2eb10 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
2eb20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2eb30 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
2eb40 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
2eb50 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
2eb60 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2eb70 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
2eb80 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
2eb90 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
2eba0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
2ebb0 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
2ebc0 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
2ebd0 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
2ebe0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
2ebf0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2ec00 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
2ec10 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
2ec20 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2ec30 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
2ec40 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
2ec50 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
2ec60 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2ec70 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2ec80 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2ec90 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ABLE)==0 );.    
2eca0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2ecb0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2ecc0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2ecd0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2ece0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2ecf0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2ed00 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2ed10 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2ed20 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2ed30 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2ed40 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2ed50 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2ed60 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2ed70 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2ed80 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2ed90 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2eda0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2edb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2edc0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2edd0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2ede0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2edf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2ee00 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2ee10 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2ee20 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2ee30 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2ee40 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2ee50 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2ee60 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2ee70 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2ee80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ee90 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2eea0 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2eeb0 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2eec0 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eee0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2eef0 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2ef00 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2ef10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ef20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2ef30 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
2ef40 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
2ef50 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2ef60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ef70 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
2ef80 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2ef90 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2efa0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2efb0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2efc0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2efd0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2efe0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2eff0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
2f000 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2f010 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2f020 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2f030 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
2f040 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
2f050 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2f060 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2f070 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2f080 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
2f090 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2f0a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2f0b0 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
2f0c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2f0d0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2f0e0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
2f0f0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2f100 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f110 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
2f120 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2f130 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2f140 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
2f150 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2f160 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
2f170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2f180 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
2f190 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
2f1a0 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
2f1b0 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
2f1c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2f1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f1e0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
2f1f0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
2f200 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2f210 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e  tinct = pIndex->
2f220 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
2f230 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2f240 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2f250 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
2f260 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
2f270 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
2f280 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
2f290 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
2f2a0 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
2f2b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2f2c0 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
2f2d0 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
2f2e0 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
2f2f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43    for(j=0; j<=nC
2f300 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
2f310 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
2f320 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
2f330 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
2f340 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
2f350 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
2f360 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
2f370 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
2f380 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
2f390 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
2f3a0 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2f3b0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2f3c0 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2f3d0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2f3e0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2f3f0 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2f400 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2f410 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f420 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2f430 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2f440 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f460 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2f470 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2f480 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2f490 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2f4a0 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2f4b0 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2f4c0 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2f4d0 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2f4e0 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2f4f0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2f500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f510 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e     if( j<nColumn
2f520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2f530 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f   Normal index co
2f540 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
2f550 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
2f560 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
2f570 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
2f580 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f  dx = pIndex->aSo
2f590 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
2f5a0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2f5b0 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  n==pIndex->pTabl
2f5c0 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75  e->iPKey ) iColu
2f5d0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2f5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f5f0 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63    /* The ROWID c
2f600 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64  olumn at the end
2f610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2f620 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e  sert( j==nColumn
2f630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43   );.          iC
2f640 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2f650 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
2f660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2f670 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
2f680 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
2f690 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
2f6a0 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
2f6b0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
2f6c0 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
2f6d0 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20  ell-ordered .   
2f6e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f6f0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2f700 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
2f710 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
2f720 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
2f730 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2f740 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
2f750 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
2f760 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
2f770 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2f780 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2f790 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2f7a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2f7b0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
2f7c0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
2f7d0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2f7e0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
2f7f0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
2f800 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72  ndex and and mar
2f810 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
2f820 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
2f830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
2f840 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
2f850 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
2f860 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
2f870 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
2f880 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
2f890 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2f8a0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2f8b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2f8c0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2f8d0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2f8e0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2f8f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2f900 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
2f910 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
2f920 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
2f930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
2f940 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2f950 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
2f960 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
2f970 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
2f980 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
2f990 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
2f9a0 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
2f9b0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2f9c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
2f9d0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
2f9e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2f9f0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2fa00 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2fa10 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2fa20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  xpr->iColumn!=iC
2fa30 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
2fa40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fa50 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2fa60 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
2fa70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2fa80 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2fa90 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2faa0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2fab0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2fac0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2fad0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2fae0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2faf0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
2fb00 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ->zName, pIndex-
2fb10 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
2fb20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2fb30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fb40 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
2fb50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2fb60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fb70 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a   if( isMatch ){.
2fb80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2fb90 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
2fba0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2fbb0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2fbc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2fbd0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2fbe0 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
2fbf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
2fc00 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2fc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2fc20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2fc30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
2fc40 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
2fc50 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2fc60 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
2fc70 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
2fc80 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
2fc90 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
2fca0 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
2fcb0 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
2fcc0 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
2fcd0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
2fce0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
2fcf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2fd00 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
2fd10 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
2fd20 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
2fd30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2fd40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76               rev
2fd60 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
2fd70 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2fd80 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
2fd90 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70      if( rev ) *p
2fda0 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  RevMask |= MASKB
2fdb0 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  IT(iLoop);.     
2fdc0 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
2fdd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2fde0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2fdf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fe00 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
2fe10 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
2fe20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
2fe30 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  || j<nColumn ){.
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2fe50 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2fe60 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
2fe70 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2fe80 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2fe90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2feb0 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
2fec0 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
2fed0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
2fee0 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
2fef0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
2ff00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ff10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2ff20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2ff30 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2ff40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ff50 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
2ff60 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
2ff70 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
2ff80 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
2ff90 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
2ffa0 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
2ffb0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2ffc0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
2ffd0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2ffe0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
2fff0 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
30000 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
30010 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
30020 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66  r *p;.        if
30030 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
30040 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
30050 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
30060 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
30070 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  r;.        if( (
30080 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26  exprTableUsage(&
30090 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
300a0 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69  , p)&~orderDisti
300b0 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
300c0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
300d0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
300e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
300f0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
30100 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
30110 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
30120 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
30130 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
30140 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
30150 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
30160 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64   1;.  if( !isOrd
30170 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  erDistinct ) ret
30180 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
30190 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  -1;.}..#ifdef WH
301a0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
301b0 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
301c0 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
301d0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
301e0 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
301f0 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
30200 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
30210 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
30220 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
30230 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
30240 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
30250 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
30260 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
30270 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
30280 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
30290 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
302a0 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
302b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
302c0 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
302d0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
302e0 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
302f0 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
30300 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
30310 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
30320 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
30330 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
30340 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
30350 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
30360 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
30370 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
30380 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
30390 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
303a0 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
303b0 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
303c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
303d0 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
303e0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
303f0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
30400 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
30410 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
30420 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
30430 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
30440 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
30450 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
30460 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
30470 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
30480 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
30490 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
304a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
304b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
304c0 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
304d0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57  eInfo *pWInfo, W
304e0 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74  hereCost nRowEst
304f0 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
30500 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
30510 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
30520 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
30530 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
30540 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
30550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30560 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
30570 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
30580 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
30590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
305a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
305b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
305d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
305e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
305f0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
30600 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
30610 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
30620 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
30630 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
30640 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
30650 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
30660 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  rs */.  WhereCos
30670 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
30680 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
30690 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65 72  a path */.  Wher
306a0 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  eCost mxCost = 0
306b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
306c0 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
306d0 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
306e0 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43  WhereCost rSortC
306f0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
30700 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72  Cost to do a sor
30710 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  t */.  int nTo, 
30720 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
30730 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
30740 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
30750 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
30760 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
30770 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
30780 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
30790 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
307a0 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
307b0 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
307c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
307d0 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
307e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
307f0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
30800 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
30810 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
30820 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
30830 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
30840 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
30850 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
30860 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
30870 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
30880 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
30890 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
308a0 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
308b0 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
308c0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
308d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
308e0 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
308f0 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
30900 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
30910 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  y */.  char *pSp
30920 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
30930 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
30940 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
30950 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  s routine */..  
30960 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
30970 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
30980 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
30990 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
309a0 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
309b0 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
309c0 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
309d0 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
309e0 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
309f0 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
30a00 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
30a10 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
30a20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
30a30 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
30a40 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
30a50 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
30a60 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31  oice = (nLoop==1
30a70 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
30a80 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
30a90 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
30aa0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
30ab0 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
30ac0 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
30ad0 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c  -- begin solver\
30ae0 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  n"));..  /* Allo
30af0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
30b00 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
30b10 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20  o and aFrom */. 
30b20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68   ii = (sizeof(Wh
30b30 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
30b40 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
30b50 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
30b60 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
30b70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
30b80 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61   ii);.  if( pSpa
30b90 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
30ba0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
30bb0 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
30bc0 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
30bd0 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
30be0 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
30bf0 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
30c00 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
30c10 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
30c20 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
30c30 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32  or(ii=mxChoice*2
30c40 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e  , pFrom=aTo; ii>
30c50 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b  0; ii--, pFrom++
30c60 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
30c70 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
30c80 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = pX;.  }..  /*
30c90 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
30ca0 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
30cb0 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
30cc0 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
30cd0 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
30ce0 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
30cf0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30d00 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
30d10 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20  ove 25.  If the 
30d20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
30d30 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
30d40 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
30d50 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
30d60 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20  n the first 25. 
30d70 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
30d80 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
30d90 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
30da0 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
30db0 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
30dc0 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b  nQueryLoop, 46);
30dd0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
30de0 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
30df0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
30e00 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
30e10 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
30e20 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
30e30 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
30e40 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
30e50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
30e60 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
30e70 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
30e80 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b    rSortCost = 0;
30e90 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
30ea0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
30eb0 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
30ec0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
30ed0 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
30ee0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e  else{.    /* TUN
30ef0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
30f00 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
30f10 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  s N*log2(N) wher
30f20 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a  e N is the.    *
30f30 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * number of outp
30f40 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20  ut rows. */.    
30f50 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
30f60 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f  Est + estLog(nRo
30f70 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45  wEst);.    WHERE
30f80 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d  TRACE(0x002,("--
30f90 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
30fa0 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29  d\n", rSortCost)
30fb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
30fc0 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
30fd0 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
30fe0 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
30ff0 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
31000 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
31010 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
31020 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
31030 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
31040 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
31050 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
31060 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
31070 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
31080 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
31090 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
310a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
310b0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
310c0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
310d0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
310e0 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
310f0 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
31100 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
31110 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
31120 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61        Bitmask ma
31130 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42  skNew;.        B
31140 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
31150 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69   0;.        u8 i
31160 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
31170 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
31180 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75  Valid;.        u
31190 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
311a0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
311b0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
311c0 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
311d0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
311e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
311f0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
31200 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
31210 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
31220 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
31230 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
31240 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
31250 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
31260 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
31270 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
31280 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
31290 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73   */.        rCos
312a0 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  t = whereCostAdd
312b0 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
312c0 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
312d0 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
312e0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65       rCost = whe
312f0 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c  reCostAdd(rCost,
31300 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a   pFrom->rCost);.
31310 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
31320 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
31330 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
31340 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
31350 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69  ( !isOrderedVali
31360 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
31370 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68  witch( wherePath
31380 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
31390 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
313a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313b0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
313c0 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
313d0 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
31400 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a  p, &revMask) ){.
31410 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
31420 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46   1:  /* Yes.  pF
31430 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20  rom+pWLoop does 
31440 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
31450 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31470 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  rdered = 1;.    
31480 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
31490 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
314a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
314b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  k;.            c
314c0 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20  ase 0:  /* No.  
314d0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c  pFrom+pWLoop wil
314e0 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61  l require a sepa
314f0 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20  rate sort */.   
31500 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31510 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ered = 0;.      
31520 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31530 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
31540 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
31550 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
31560 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29  Cost, rSortCost)
31570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
31590 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43     default: /* C
315a0 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20  annot tell yet. 
315b0 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68   Try again on th
315c0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
315d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
315e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
315f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
31600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
31610 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
31620 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
31630 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  }.        /* Che
31640 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
31650 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
31660 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f  ded to the mxCho
31670 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20  ice best so far 
31680 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
31690 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
316a0 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
316b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
316c0 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
316d0 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d  =maskNew && pTo-
316e0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d  >isOrderedValid=
316f0 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  =isOrderedValid 
31700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
31710 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
31720 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
31730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31750 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
31760 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
31770 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
31780 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
31790 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
317a0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
317b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
317c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
317d0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
317e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
317f0 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
31800 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f 72    %s cost=%3d or
31810 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
31830 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
31840 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
31850 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
31860 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31870 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
31880 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
31890 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
318a0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
318b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
318c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
318d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
318e0 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74  Add a new Path t
318f0 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20  o the aTo[] set 
31900 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
31910 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
31920 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
31930 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
31940 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
31950 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
31960 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
31970 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
31980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31990 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
319a0 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
319b0 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
319c0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
319d0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
319e0 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61   for(jj=nTo-1; a
319f0 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43  To[jj].rCost<mxC
31a00 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65  ost; jj--){ asse
31a10 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20  rt(jj>0); }.    
31a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a30 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
31a40 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
31a50 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31a60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
31a70 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
31a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
31a90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31aa0 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
31ab0 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c  t=%-3d order=%c\
31ac0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31ad0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31ae0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
31af0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
31b20 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
31b30 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
31b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
31b50 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
31b60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
31b70 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
31b80 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
31b90 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31bb0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
31bc0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
31bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31be0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b               "Sk
31c00 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
31c10 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31c30 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
31c40 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
31c50 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31c70 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
31c80 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31c90 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31cb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
31cc0 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
31cd0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
31d00 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
31d10 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
31d40 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
31d50 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
31d60 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
31d70 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31d80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
31d90 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
31da0 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
31db0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
31dc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31dd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31de0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
31df0 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
31e00 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62    /* A new and b
31e10 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20  etter score for 
31e20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65  a previously cre
31e30 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20  ated equivalent 
31e40 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57  path */.#ifdef W
31e50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
31e60 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  D.          if( 
31e70 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
31e80 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
31e90 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31ea0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
31eb0 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
31ec0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
31ed0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
31ee0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31ef0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
31f00 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
31f10 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
31f20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
31f30 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
31f40 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
31f50 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
31f60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31f70 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
31f80 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
31f90 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
31fa0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
31fb0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
31fc0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
31fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31fe0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31ff0 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
32000 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
32010 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
32020 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
32030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32040 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
32050 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
32060 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
32070 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
32080 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
32090 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
320a0 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
320b0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
320c0 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
320d0 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
320e0 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46    pTo->nRow = pF
320f0 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
32100 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
32110 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
32120 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
32130 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
32140 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c  d = isOrderedVal
32150 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  id;.        pTo-
32160 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
32170 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
32180 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
32190 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
321a0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
321b0 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
321c0 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
321d0 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
321e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
321f0 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
32200 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
32210 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
32220 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31          for(jj=1
32230 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a  , pTo=&aTo[1]; j
32240 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b  j<mxChoice; jj++
32250 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
32260 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
32270 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78  Cost>mxCost ) mx
32280 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
32290 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
322a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
322b0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
322c0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
322d0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
322e0 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
322f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
32300 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
32310 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
32320 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
32330 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
32340 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
32350 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
32360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32370 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
32380 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
32390 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
323a0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
323b0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
323c0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
323d0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
323e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
323f0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32400 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
32410 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
32420 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
32430 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
32440 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69  dValid && pTo->i
32450 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  sOrdered ){.    
32460 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32470 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
32480 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
32490 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
324a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
324b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
324c0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
324d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
324e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
324f0 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
32500 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
32510 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
32520 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
32530 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
32540 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
32550 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
32560 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
32570 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
32580 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
32590 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
325a0 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
325b0 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
325c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
325d0 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
325e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
325f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
32600 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
32610 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
32620 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
32630 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
32640 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
32650 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73 65   = aFrom;.  asse
32660 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a  rt( nFrom==1 );.
32670 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f 6c  #if 0 /* The fol
32680 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65 64  lowing is needed
32690 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76 65   if nFrom is eve
326a0 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a 2f  r more than 1 */
326b0 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
326c0 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
326d0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
326e0 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
326f0 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
32700 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e  rom[ii];.  }.#en
32710 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57  dif.  assert( pW
32720 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
32730 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
32740 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
32750 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
32760 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
32770 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
32780 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
32790 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
327a0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
327b0 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
327c0 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
327d0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
327e0 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
327f0 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
32800 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
32810 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
32820 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
32830 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
32840 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
32850 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
32860 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32870 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
32880 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
32890 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
328a0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
328b0 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
328c0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
328d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
328e0 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
328f0 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
32900 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
32910 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
32920 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
32930 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
32940 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
32950 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
32960 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
32970 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
32980 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
32990 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
329a0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
329b0 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  1 ) pWInfo->eDis
329c0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
329d0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
329e0 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d    }.  if( pFrom-
329f0 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
32a00 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
32a10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32a20 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
32a30 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
32a40 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
32a50 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
32a60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32a70 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74    pWInfo->bOBSat
32a80 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e   = 1;.      pWIn
32a90 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
32aa0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
32ab0 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f    }.  }.  pWInfo
32ac0 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
32ad0 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
32ae0 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
32af0 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
32b00 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
32b10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
32b20 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
32b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
32b40 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65  *.** Most querie
32b50 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e  s use only a sin
32b60 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20  gle table (they 
32b70 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61  are not joins) a
32b80 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c  nd have.** simpl
32b90 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
32ba0 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64   against indexed
32bb0 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72   fields.  This r
32bc0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a  outine attempts.
32bd0 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65  ** to plan those
32be0 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73   simple cases us
32bf0 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65  ing much less ce
32c00 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a  remony than the.
32c10 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
32c20 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
32c30 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69  , and thereby yi
32c40 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74  eld faster sqlit
32c50 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20  e3_prepare().** 
32c60 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f  times for the co
32c70 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  mmon case..**.**
32c80 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
32c90 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20   on success, if 
32ca0 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
32cb0 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
32cc0 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71  s.** no-frills q
32cd0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52  uery planner.  R
32ce0 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68  eturn zero if th
32cf0 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74  is query needs t
32d00 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  he .** general-p
32d10 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
32d20 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nner..*/.static 
32d30 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75  int whereShortCu
32d40 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
32d50 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
32d60 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
32d70 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  fo;.  struct Src
32d80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
32d90 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
32da0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72  *pWC;.  WhereTer
32db0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72  m *pTerm;.  Wher
32dc0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
32dd0 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
32de0 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  j;.  Table *pTab
32df0 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
32e00 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  .  .  pWInfo = p
32e10 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
32e20 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
32e30 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32e40 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20  E_FORCE_TABLE ) 
32e50 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
32e60 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
32e70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
32e80 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
32e90 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
32ea0 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
32eb0 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
32ec0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
32ed0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
32ee0 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65  tem->zIndex ) re
32ef0 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
32f00 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
32f10 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
32f20 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
32f30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
32f40 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
32f50 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  s = 0;.  pTerm =
32f60 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
32f70 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
32f80 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  Q, 0);.  if( pTe
32f90 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  rm ){.    pLoop-
32fa0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
32fb0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
32fc0 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
32fd0 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
32fe0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
32ff0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
33000 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
33010 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
33020 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
33030 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
33040 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
33050 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
33060 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
33070 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29 20 2a  =whereCost(10) *
33080 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
33090 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
330a0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
330b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
330c0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
330d0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
330e0 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
330f0 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74  xWhere!=0 ) cont
33100 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
33110 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
33120 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
33130 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
33140 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
33150 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
33160 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  ], 0, WO_EQ, pId
33170 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
33180 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
33190 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
331a0 6f 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66 6f  oopResize(pWInfo
331b0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  ->pParse->db, pL
331c0 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  oop, j);.       
331d0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
331e0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
331f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
33200 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  pIdx->nColumn ) 
33210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
33220 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
33230 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
33240 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
33250 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
33260 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63     if( (pItem->c
33270 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
33280 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
33290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
332a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
332b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
332c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
332d0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
332e0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
332f0 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
33300 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
33310 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
33320 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
33330 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
33340 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
33350 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
33360 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
33370 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65  9;  /* 39==where
33380 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  Cost(15) */.    
33390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
333a0 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
333b0 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
333c0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68  Loop->nOut = (Wh
333d0 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70  ereCost)1;.    p
333e0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
333f0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
33400 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
33410 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
33420 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
33430 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  r);.    pWInfo->
33440 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69  a[0].iTabCur = i
33450 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  Cur;.    pWInfo-
33460 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20  >nRowOut = 1;.  
33470 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
33480 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
33490 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20  >bOBSat =  1;.  
334a0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
334b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
334c0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
334d0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
334e0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
334f0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
33500 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
33510 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
33520 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
33530 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
33540 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
33550 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
33560 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
33570 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
33580 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
33590 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
335a0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
335b0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
335c0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
335d0 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
335e0 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
335f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
33600 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
33610 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
33620 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
33630 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
33640 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
33650 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
33660 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
33670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
33680 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
33690 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
336a0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
336b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
336c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
336d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
336e0 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
336f0 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
33700 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
33710 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
33720 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
33730 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
33740 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
33750 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
33760 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
33770 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
33780 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
33790 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
337a0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
337b0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
337c0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
337d0 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
337e0 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
337f0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
33800 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
33810 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
33820 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
33830 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
33840 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
33850 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
33860 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
33870 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
33880 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
33890 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
338a0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
338b0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
338c0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
338d0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
338e0 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
338f0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
33900 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
33910 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
33920 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
33930 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
33940 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
33950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33960 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
33970 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
33980 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
339a0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
339b0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
339c0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
339d0 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
339e0 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
339f0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
33a00 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
33a10 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
33a20 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
33a30 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
33a40 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
33a50 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
33a60 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
33a70 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
33a80 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
33a90 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
33aa0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
33ab0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
33ac0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
33ad0 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
33ae0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
33af0 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
33b00 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
33b10 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
33b20 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
33b30 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
33b40 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
33b50 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
33b60 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
33b70 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
33b80 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
33b90 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
33ba0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
33bb0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
33bc0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
33bd0 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
33be0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
33bf0 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
33c00 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
33c10 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
33c20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
33c30 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
33c40 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
33c50 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
33c60 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
33c70 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
33c80 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
33c90 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
33ca0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
33cb0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
33cc0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
33cd0 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
33ce0 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
33cf0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
33d00 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
33d10 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
33d20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
33d30 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
33d40 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
33d50 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
33d60 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
33d70 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
33d80 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
33d90 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
33da0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
33db0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
33dc0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
33dd0 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
33de0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33df0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
33e00 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
33e10 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
33e20 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
33e30 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
33e40 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
33e50 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
33e60 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
33e70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
33e80 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
33e90 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
33ea0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
33eb0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
33ec0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
33ed0 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
33ee0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
33ef0 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
33f00 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
33f10 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
33f20 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
33f30 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
33f40 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
33f50 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
33f60 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
33f70 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33f80 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
33f90 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
33fa0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
33fb0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
33fc0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
33fd0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
33fe0 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
33ff0 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
34000 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
34010 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
34020 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
34030 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
34040 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
34050 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
34060 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
34070 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
34080 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
34090 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
340a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
340b0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
340c0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
340d0 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
340e0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
340f0 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
34100 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
34110 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
34120 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
34130 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
34140 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
34150 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
34160 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
34170 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
34180 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
34190 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
341a0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
341b0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
341c0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
341d0 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
341e0 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
341f0 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
34200 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
34210 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
34220 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
34230 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
34240 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
34250 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
34260 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
34270 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
34280 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
34290 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
342a0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
342b0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
342c0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
342d0 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
342e0 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68  y is NULL..*/.Wh
342f0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
34300 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
34310 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
34320 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
34330 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
34340 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
34350 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
34360 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
34370 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
34380 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
34390 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
343a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
343b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
343c0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
343d0 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
343e0 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
343f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
34400 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52  pResultSet, /* R
34410 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
34420 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20   query */.  u16 
34430 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
34440 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
34450 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
34460 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
34470 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt.h */.  int iI
34480 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
34490 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54  /* If WHERE_ONET
344a0 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
344b0 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
344c0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
344d0 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
344e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
344f0 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
34500 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
34510 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
34520 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
34530 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34540 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
34550 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
34560 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
34570 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
34580 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
34590 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
345a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
345b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
345c0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
345d0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
345e0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
345f0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
34600 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
34610 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
34620 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
34630 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
34640 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
34650 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
34660 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
34670 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
34680 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
34690 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
346a0 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
346b0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
346c0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
346d0 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
346e0 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
346f0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
34700 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
34710 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
34720 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
34730 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
34740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
34750 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
34760 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
34770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
34780 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
34790 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
347a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
347c0 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
347d0 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
347e0 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
347f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
34800 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
34810 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57  eof(sWLB));.  sW
34820 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
34830 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
34840 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
34850 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
34860 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
34870 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
34880 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
34890 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
348a0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
348b0 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
348c0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
348d0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
348e0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
348f0 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
34900 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
34910 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
34920 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
34930 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
34940 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
34950 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
34960 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
34970 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
34980 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
34990 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
349a0 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
349b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
349c0 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
349d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
349e0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
349f0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
34a00 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
34a10 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
34a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
34a30 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
34a40 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
34a50 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
34a60 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
34a70 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
34a80 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
34a90 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
34aa0 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
34ab0 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
34ac0 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
34ad0 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
34ae0 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
34af0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
34b00 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
34b10 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
34b20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
34b30 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
34b40 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
34b50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34b60 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
34b70 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
34b80 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
34b90 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
34ba0 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
34bb0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
34bc0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
34bd0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
34be0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
34bf0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
34c00 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
34c10 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
34c20 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
34c30 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
34c40 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
34c50 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
34c60 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
34c70 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
34c80 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
34c90 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
34ca0 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
34cb0 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
34cc0 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
34cd0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
34ce0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
34cf0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
34d00 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
34d10 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
34d20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
34d30 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
34d40 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
34d50 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
34d60 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
34d70 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
34d80 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
34d90 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69   nByteWInfo + si
34da0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
34db0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
34dc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
34dd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
34de0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
34df0 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
34e00 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34e10 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
34e20 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
34e30 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
34e40 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
34e50 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
34e60 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
34e70 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
34e80 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
34e90 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
34ea0 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
34eb0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
34ec0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
34ed0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
34ee0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
34ef0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
34f00 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
34f10 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
34f20 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
34f30 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
34f40 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
34f50 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
34f60 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
34f70 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
34f80 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
34f90 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
34fa0 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
34fb0 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
34fc0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
34fd0 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
34fe0 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
34ff0 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
35000 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
35010 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
35020 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
35030 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
35040 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
35050 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
35060 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
35070 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
35080 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
35090 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
350a0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
350b0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
350c0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
350d0 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
350e0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
350f0 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65  WInfo);.  sqlite
35100 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e  3ExprCodeConstan
35110 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ts(pParse, pWher
35120 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  e);.  whereSplit
35130 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
35140 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20  Where, TK_AND); 
35150 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34    /* IMP: R-1584
35160 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 73 71 6c  2-53296 */.  sql
35170 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
35180 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
35190 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
351a0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
351b0 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  Goto */.    .  /
351c0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
351d0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
351e0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
351f0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
35200 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
35210 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
35220 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
35230 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
35240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
35250 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
35260 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
35270 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
35280 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
35290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
352a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
352b0 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
352c0 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
352d0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
352e0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
352f0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
35300 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73  e: No FROM claus
35310 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61  e.  */.  if( nTa
35320 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  bList==0 ){.    
35330 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
35340 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
35350 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  1;.    if( wctrl
35360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
35370 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
35380 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
35390 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
353a0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
353b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
353c0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
353d0 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
353e0 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
353f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
35400 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
35410 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
35420 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
35430 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
35440 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
35450 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
35460 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
35470 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
35480 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
35490 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
354a0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
354b0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
354c0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
354d0 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
354e0 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
354f0 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
35500 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
35510 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
35520 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
35530 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
35540 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
35550 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
35560 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
35570 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
35580 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
35590 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
355a0 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
355b0 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
355c0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
355d0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
355e0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
355f0 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
35600 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
35610 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
35620 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
35630 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
35640 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
35650 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
35660 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
35670 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
35680 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
35690 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
356a0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
356b0 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
356c0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
356d0 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
356e0 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
356f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
35700 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
35710 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
35720 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
35730 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
35740 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
35750 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
35760 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
35770 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
35780 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
35790 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
357a0 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
357b0 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
357c0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
357d0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
357e0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
357f0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
35800 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
35810 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
35820 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
35830 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
35840 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
35850 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
35860 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
35870 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
35880 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
35890 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
358a0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
358b0 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
358c0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
358d0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
358e0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
358f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
35900 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
35910 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
35920 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
35930 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
35940 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
35950 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
35960 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
35970 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
35980 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
35990 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
359a0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
359b0 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
359c0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
359d0 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
359e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
359f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
35a00 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
35a10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
35a20 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
35a30 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74   BY) clause cont
35a40 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
35a50 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20  to general.  ** 
35a60 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65  expressions, the
35a70 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62  n we won't be ab
35a80 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69 74  le to satisfy it
35a90 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20   using indices, 
35aa0 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  so.  ** go ahead
35ab0 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20   and disable it 
35ac0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
35ad0 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63 74  pOrderBy && (wct
35ae0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35af0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
35b00 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  0 ){.    for(ii=
35b10 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e  0; ii<pOrderBy->
35b20 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
35b30 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
35b40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
35b50 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
35b60 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  y->a[ii].pExpr);
35b70 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
35b80 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
35b90 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
35ba0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
35bb0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
35bc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35bd0 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
35be0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
35bf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35c00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
35c10 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
35c20 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
35c30 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
35c40 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
35c50 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
35c60 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
35c70 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
35c80 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
35c90 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
35ca0 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
35cb0 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
35cc0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
35cd0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
35ce0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
35cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35d00 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
35d10 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
35d20 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
35d30 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
35d40 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
35d50 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
35d60 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
35d70 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
35d80 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
35d90 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35da0 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
35db0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35dc0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
35dd0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
35de0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
35df0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
35e00 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
35e10 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 6e 54 61  \n"));.  if( nTa
35e20 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
35e30 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
35e40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
35e50 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
35e60 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
35e70 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
35e80 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20  eginError;.  .  
35e90 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
35ea0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
35eb0 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65  p objects if whe
35ec0 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c  retrace is enabl
35ed0 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  ed */.#ifdef WHE
35ee0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
35ef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35f00 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
35f10 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
35f20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
35f30 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
35f40 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
35f50 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
35f60 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
35f70 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
35f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f90 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
35fa0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
35fb0 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
35fc0 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
35fd0 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
35fe0 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
35ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
36000 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
36010 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
36020 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
36030 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  nt(p, pTabList);
36040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
36050 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
36060 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
36070 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
36080 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
36090 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
360a0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
360b0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
360c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
360d0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
360e0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
360f0 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
36100 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
36110 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
36120 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
36130 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
36140 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
36150 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
36160 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
36170 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
36180 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
36190 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
361a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
361b0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
361c0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
361d0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
361e0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
361f0 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
36200 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
36210 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
36220 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e  eTrace ){.    in
36230 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  t ii;.    sqlite
36240 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
36250 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77  -- Solution nRow
36260 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  =%d", pWInfo->nR
36270 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  owOut);.    if( 
36280 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29  pWInfo->bOBSat )
36290 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
362a0 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
362b0 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57  ERBY=0x%llx", pW
362c0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
362d0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
362e0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
362f0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
36300 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
36310 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
36320 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36330 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
36340 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
36350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36360 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
36370 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
36380 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
36390 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
363a0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
363b0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
363c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
363d0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
363e0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
363f0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
36400 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36410 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
36420 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
36430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36440 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
36450 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36460 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
36470 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
36480 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
36490 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
364a0 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
364b0 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69  ].pWLoop, pTabLi
364c0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  st);.    }.  }.#
364d0 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
364e0 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
364f0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
36500 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
36510 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
36520 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
36530 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
36540 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20  ResultSet!=0.   
36550 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
36560 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
36570 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
36580 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
36590 20 74 61 62 55 73 65 64 20 3d 20 65 78 70 72 4c   tabUsed = exprL
365a0 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
365b0 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
365c0 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  et);.    if( pOr
365d0 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
365e0 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
365f0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
36600 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
36610 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
36620 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
36630 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
36640 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
36650 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
36660 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
36670 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
36680 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
36690 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
366a0 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
366b0 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
366c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
366d0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
366e0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
366f0 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
36700 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
36710 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
36720 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
36730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36740 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
36750 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
36760 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
36770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
36780 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
36790 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
367a0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
367b0 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
367c0 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
367d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
367e0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
367f0 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
36800 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
36810 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
36820 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
36830 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
36840 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
36850 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36870 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
36880 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
36890 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
368a0 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
368b0 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
368c0 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
368d0 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
368e0 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
368f0 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
36900 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
36910 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
36920 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
36930 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
36940 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
36950 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
36960 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
36970 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
36980 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
36990 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
369a0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
369b0 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
369c0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
369d0 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
369e0 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
369f0 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
36a00 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
36a10 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
36a20 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
36a30 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
36a40 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
36a50 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
36a60 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
36a70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
36a80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36a90 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
36aa0 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
36ab0 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
36ac0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
36ad0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
36ae0 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
36af0 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
36b00 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
36b10 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
36b20 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
36b30 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
36b40 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
36b50 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
36b60 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
36b70 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
36b80 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
36b90 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
36ba0 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
36bb0 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
36bc0 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
36bd0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
36be0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
36bf0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
36c00 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
36c10 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
36c20 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
36c30 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
36c40 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
36c50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
36c60 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
36c70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
36c80 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
36c90 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
36ca0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
36cb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
36cc0 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
36cd0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
36ce0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
36cf0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
36d00 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
36d10 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
36d20 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
36d30 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
36d40 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
36d50 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
36d60 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
36d70 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
36d80 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
36d90 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
36da0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
36db0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
36dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36dd0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36de0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
36df0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
36e00 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
36e10 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
36e20 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
36e30 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
36e40 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
36e50 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
36e60 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
36e70 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
36e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
36e90 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
36ea0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
36eb0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
36ec0 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
36ed0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
36ee0 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
36ef0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
36f00 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
36f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
36f20 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
36f30 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
36f40 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
36f50 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
36f60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
36f70 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
36f80 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
36f90 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
36fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
36fb0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
36fc0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
36fd0 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
36fe0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
36ff0 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
37000 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
37010 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
37020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
37030 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
37040 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
37050 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
37060 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
37070 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
37080 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
37090 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
370a0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
370b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
370c0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
370d0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
370e0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
370f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
37100 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
37110 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
37120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37130 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
37140 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
37150 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
37160 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
37170 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
37180 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
371a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
371b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
371c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
371d0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
371e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
371f0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
37200 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
37210 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
37220 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
37230 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
37240 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
37250 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
37260 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
37270 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
37280 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
37290 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
372a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
372b0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
372c0 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
372d0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
372e0 65 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ex;.      KeyInf
372f0 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
37300 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
37310 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
37320 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 41 73 20    /* FIXME:  As 
37330 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
37340 75 73 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  use pTabItem->iC
37350 75 72 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49  ursor if WHERE_I
37360 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20  DX_ONLY */.     
37370 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d   int iIndexCur =
37380 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37390 20 3d 20 69 49 64 78 43 75 72 20 3f 20 69 49 64   = iIdxCur ? iId
373a0 78 43 75 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e  xCur : pParse->n
373b0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
373c0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
373d0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
373e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
373f0 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
37400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37410 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
37420 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78  OpenRead, iIndex
37430 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
37440 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
37450 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
37460 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
37470 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
37480 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
37490 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
374a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
374b0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
374c0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
374d0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74  e, iDb);.    not
374e0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
374f0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
37500 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
37510 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
37520 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
37530 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
37540 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
37550 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
37560 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
37570 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
37580 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
37590 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
375a0 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
375b0 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
375c0 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
375d0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
375e0 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
375f0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
37600 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
37610 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
37620 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
37630 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
37640 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
37650 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
37660 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70  ->a[ii];.    exp
37670 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
37680 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
37690 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
376a0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
376b0 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  ags);.    notRea
376c0 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  dy = codeOneLoop
376d0 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
376e0 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
376f0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
37700 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
37710 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCont;.  }..  /*
37720 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75   Done. */.  retu
37730 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
37740 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
37750 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
37760 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
37770 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
37780 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
37790 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
377a0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
377b0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
377c0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
377d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
377e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
377f0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
37800 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
37810 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
37820 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
37830 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
37840 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
37850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
37860 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
37870 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
37880 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
37890 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
378a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
378b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
378c0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
378d0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
378e0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
378f0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
37900 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
37910 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
37920 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
37930 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
37940 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
37950 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
37960 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
37970 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
37980 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
37990 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
379a0 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
379b0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
379c0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
379d0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
379e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
379f0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37a00 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
37a10 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
37a20 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
37a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37a40 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
37a50 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
37a60 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
37a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
37a80 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
37a90 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
37aa0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
37ab0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
37ac0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
37ad0 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
37ae0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
37af0 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
37b00 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
37b10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37b20 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
37b30 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
37b40 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
37b50 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
37b60 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
37b70 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
37b80 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
37b90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37ba0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
37bb0 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
37bc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37bd0 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
37be0 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
37bf0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37c00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37c10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37c20 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37c30 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
37c40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
37c50 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
37c60 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
37c70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
37c80 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37c90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
37ca0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
37cb0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
37cc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
37cd0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
37ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37cf0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
37d00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
37d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
37d20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37d30 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
37d40 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
37d50 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37d60 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
37d70 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
37d80 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
37d90 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37da0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
37db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37dc0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
37dd0 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
37de0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
37df0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
37e00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37e10 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
37e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37e30 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
37e40 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
37e50 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
37e60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
37e70 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
37e80 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
37e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37ea0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
37eb0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
37ec0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
37ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37ef0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
37f00 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
37f10 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
37f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37f30 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
37f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
37f50 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
37f60 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
37f70 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
37f80 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
37f90 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
37fa0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
37fb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
37fc0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
37fd0 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
37fe0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
37ff0 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
38000 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
38010 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
38020 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
38030 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
38040 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
38050 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
38060 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
38070 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
38080 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
38090 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20  ex *pIdx = 0;.  
380a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
380b0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
380c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
380d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
380e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
380f0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
38100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
38110 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  b!=0 );.    pLoo
38120 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
38130 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
38140 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
38150 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
38160 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
38170 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
38180 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
38190 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
381a0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OPEN_CLOSE)==0.
381b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
381c0 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
381d0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
381e0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
381f0 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
38200 45 5f 49 44 58 5f 4f 4e 4c