/ Hex Artifact Content
Login

Artifact bad23a54820dd7f4c0ec5048d3cdaed28d7e4a52:


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 69 66 28 20      }.      if( 
28dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
28de0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65  pNew->nOut = whe
28df0 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20  reCost(nOut);.  
28e00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
28e10 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28e20 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28e30 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 ){.      /* E
28e50 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73  ach row involves
28e60 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69   a step of the i
28e70 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e  ndex, then a bin
28e80 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20  ary search of.  
28e90 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20      ** the main 
28ea0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
28eb0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65  New->rRun =  whe
28ec0 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
28ed0 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32  rRun, rLogSize>2
28ee0 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
28ef0 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
28f00 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
28f10 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
28f20 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
28f30 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
28f40 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
28f50 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
28f60 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
28f70 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Out for addition
28f80 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  al constraints *
28f90 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  /.    rc = where
28fa0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28fb0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28fc0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
28fd0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28fe0 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
28ff0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
29000 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<(pProbe->nCol
29010 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  umn + (pProbe->z
29020 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
29030 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
29040 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
29050 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
29060 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
29070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
29080 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
29090 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
290a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
290b0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
290c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
290d0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
290e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
290f0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
29100 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
29110 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
29120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29130 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
29140 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
29150 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
29160 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
29170 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
29180 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
29190 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
291a0 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
291b0 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
291c0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
291d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
291e0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
291f0 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
29200 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
29210 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
29220 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
29230 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
29240 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
29250 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
29260 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
29270 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
29280 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
29290 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
292a0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
292b0 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
292c0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
292d0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
292e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
292f0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
29300 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
29310 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
29320 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
29330 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
29340 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
29350 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
29360 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
29370 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
29380 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
29390 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
293a0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
293b0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
293c0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
293d0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
293e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b  x->nColumn; jj++
293f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29400 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
29410 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
29420 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
29430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29440 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29450 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
29460 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
29470 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
29480 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
29490 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
294a0 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
294b0 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
294c0 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
294d0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
294e0 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
294f0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
29500 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
29510 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
29520 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
29530 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
29540 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
29550 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
29560 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
29570 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  [j];.    testcas
29580 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
29590 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
295a0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28  BMS-2 );.    if(
295b0 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
295c0 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
295d0 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
295e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
295f0 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
29600 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
29610 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
29620 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
29630 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
29640 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
29650 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
29660 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
29670 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
29680 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
29690 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
296a0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
296b0 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
296c0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
296d0 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
296e0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
296f0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
29700 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
29710 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
29720 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
29730 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
29740 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
29750 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
29760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
29770 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
29780 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
29790 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
297a0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
297b0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
297c0 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
297d0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
297e0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
297f0 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
29800 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
29810 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
29820 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
29830 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
29840 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
29850 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
29860 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
29870 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
29880 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
29890 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
298a0 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
298b0 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
298c0 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
298d0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
298e0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
298f0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
29900 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
29910 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
29920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29930 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
29940 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
29950 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
29960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
29970 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
29980 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
29990 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
299a0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
299b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
299c0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
299d0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
299e0 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
299f0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
29a00 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
29a10 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
29a20 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
29a30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29a40 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
29a50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
29a60 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
29a70 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
29a80 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
29a90 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
29aa0 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
29ab0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
29ac0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
29ad0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29ae0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
29af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29b00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29b10 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
29b20 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
29b30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
29b40 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b60 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
29b70 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65  n value */.  Whe
29b80 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20  reCost rSize;   
29b90 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
29ba0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
29bb0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
29bc0 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b  reCost rLogSize;
29bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
29be0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
29bf0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
29c00 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
29c10 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
29c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29c30 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
29c40 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ause */.  .  pNe
29c50 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
29c60 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
29c70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
29c80 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
29c90 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
29ca0 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
29cb0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
29cc0 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
29cd0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
29ce0 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
29cf0 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
29d00 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
29d10 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
29d20 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
29d30 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
29d40 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
29d50 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
29d60 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
29d70 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
29d80 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
29d90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
29da0 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
29db0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
29dc0 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
29dd0 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
29de0 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
29df0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
29e00 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
29e10 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
29e20 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
29e30 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
29e40 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
29e50 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
29e60 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
29e70 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
29e80 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ea0 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
29eb0 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
29ec0 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
29ed0 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
29ee0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
29ef0 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
29f00 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
29f10 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
29f20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
29f30 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
29f40 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
29f50 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
29f60 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72  sPk.pTable = pSr
29f70 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52  c->pTab;.    aiR
29f80 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72  owEstPk[0] = pSr
29f90 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
29fa0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
29fb0 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
29fc0 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
29fd0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
29fe0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
29ff0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
2a000 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
2a010 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
2a020 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
2a030 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
2a040 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
2a050 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
2a060 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
2a070 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2a080 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
2a090 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
2a0a0 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
2a0b0 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77 68    }.  rSize = wh
2a0c0 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70 54  ereCost(pSrc->pT
2a0d0 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20  ab->nRowEst);.  
2a0e0 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
2a0f0 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  g(rSize);..  /* 
2a100 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
2a110 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
2a120 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20  lder->pOrSet.   
2a130 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
2a140 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
2a150 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
2a160 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
2a170 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26  >pIndex==0.   &&
2a180 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
2a190 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
2a1a0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
2a1b0 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
2a1c0 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
2a1d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
2a1e0 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
2a1f0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
2a200 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
2a210 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
2a220 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
2a230 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
2a240 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
2a250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2a260 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
2a270 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
2a280 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2a290 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
2a2a0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
2a2b0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
2a2c0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
2a2d0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
2a2e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2a2f0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
2a300 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2a310 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
2a320 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2a330 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2a340 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2a350 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2a360 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
2a370 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2a380 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2a390 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2a3a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
2a3b0 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
2a3c0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2a3d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a3e0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2a3f0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2a400 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
2a410 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2a420 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
2a430 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
2a440 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43  sert( 28==whereC
2a450 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  ost(7) );.      
2a460 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
2a470 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
2a480 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
2a490 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2a4a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
2a4b0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2a4c0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2a4d0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2a4e0 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2a4f0 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2a500 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2a510 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2a520 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2a530 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2a540 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2a550 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2a560 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2a570 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2a580 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2a590 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2a5a0 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b  whereCost(20) );
2a5b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a5c0 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2a5d0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2a5e0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2a5f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a600 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2a610 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2a620 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2a630 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2a640 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2a650 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a660 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a670 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2a680 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f   }.  }..  /* Loo
2a690 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
2a6a0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
2a6b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a6c0 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
2a6d0 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
2a6e0 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
2a6f0 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
2a700 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
2a710 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
2a720 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e  ePartialIndex(pN
2a730 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70  ew->iTab, pWC, p
2a740 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2a750 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63  here) ){.      c
2a760 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
2a770 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
2a780 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
2a790 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
2a7a0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2a7b0 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2a7c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2a7d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
2a7e0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
2a7f0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2a800 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2a810 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
2a820 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
2a830 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
2a840 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
2a850 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
2a860 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
2a870 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
2a880 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
2a890 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
2a8a0 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
2a8b0 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
2a8c0 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
2a8d0 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
2a8e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
2a8f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2a900 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a910 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2a920 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
2a930 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
2a940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
2a950 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
2a960 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2a970 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a980 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
2a990 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
2a9a0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
2a9b0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
2a9c0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
2a9d0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2a9e0 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
2a9f0 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28  able scan is 3*(
2aa00 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
2aa10 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
2aa20 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73  xtra 3 factor is
2aa30 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
2aa40 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64  e use of indexed
2aa50 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a   lookups.      *
2aa60 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20  *     over full 
2aa70 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65  scans.  A smalle
2aa80 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73 20  r constant 2 is 
2aa90 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69 6e  used for coverin
2aaa0 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69  g.      **     i
2aab0 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74 68  ndex scans so th
2aac0 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  at a covering in
2aad0 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  dex scan will be
2aae0 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20 20   favored over.  
2aaf0 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61 62      **     a tab
2ab00 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  le scan. */.    
2ab10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2ab20 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a  hereCostAdd(rSiz
2ab30 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36  e,rLogSize) + 16
2ab40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2ab50 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2ab60 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2ab70 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2ab80 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
2ab90 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2aba0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
2abb0 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
2abc0 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
2abd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2abe0 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
2abf0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
2ac00 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
2ac10 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20  INDEXED;..      
2ac20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2ac30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2ac40 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2ac50 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
2ac60 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
2ac70 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2ac80 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2ac90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2aca0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2acb0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2acc0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2acd0 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
2ace0 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2acf0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
2ad00 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2ad10 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2ad20 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
2ad30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2ad40 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2ad50 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2ad60 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   : 0;.        if
2ad70 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
2ad80 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2ad90 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e  ost of a coverin
2ada0 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  g index scan is 
2adb0 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  2*(N + log2(N)).
2adc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
2add0 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66 61    The extra 2 fa
2ade0 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75  ctor is to encou
2adf0 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66 20  rage the use of 
2ae00 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a  indexed lookups.
2ae10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2ae20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61 6e   over index scan
2ae30 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61 6e  s.  A table scan
2ae40 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20 6f   uses a factor o
2ae50 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20 20  f 3 so that.    
2ae60 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
2ae70 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61 76  ex scans are fav
2ae80 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65 20  ored over table 
2ae90 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  scans..         
2aea0 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73 20   **  +  If this 
2aeb0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 6d  covering index m
2aec0 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20 73  ight also help s
2aed0 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
2aee0 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   BY.          **
2aef0 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68 65       clause, the
2af00 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66 75  n the cost is fu
2af10 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68 74  dged down slight
2af20 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73 0a  ly so that this.
2af30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2af40 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72 65   index is favore
2af50 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69 6e  d above other in
2af60 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65 20  dices that have 
2af70 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20 20  no hope of.     
2af80 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c 70       **     help
2af90 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52 44  ing with the ORD
2afa0 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20  ER BY. */.      
2afb0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2afc0 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74 41   10 + whereCostA
2afd0 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2afe0 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20 20  e) - b;.        
2aff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b000 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b   assert( b!=0 );
2b010 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
2b020 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73  UNING: Cost of s
2b030 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f  canning a non-co
2b040 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20  vering index is 
2b050 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20  (N+1)*log2(N).  
2b060 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
2b070 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66   we will simplif
2b080 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32  y to just N*log2
2b090 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (N) */.         
2b0a0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
2b0b0 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a  ize + rLogSize;.
2b0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b0e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2b0f0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2b100 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2b110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b120 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b130 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2b140 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2b150 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  robe, 0);..    /
2b160 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
2b170 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2b180 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
2b190 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
2b1a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
2b1b0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2b1c0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
2b1d0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2b1e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
2b1f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2b200 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
2b210 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2b220 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
2b230 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
2b240 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
2b250 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
2b260 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
2b270 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
2b280 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
2b290 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
2b2a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2b2b0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
2b2c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2b2d0 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20 57  *pBuilder   /* W
2b2e0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
2b2f0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rmation */.){.  
2b300 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b310 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
2b320 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
2b330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
2b340 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
2b350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b360 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
2b370 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2b380 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2b390 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2b3a0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2b3b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b3c0 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
2b3d0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
2b3e0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
2b3f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
2b400 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
2b410 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
2b420 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
2b430 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2b440 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
2b450 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
2b460 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2b470 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
2b480 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
2b490 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
2b4a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
2b4b0 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
2b4c0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
2b4d0 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
2b4e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b4f0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
2b500 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
2b510 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
2b520 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
2b530 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2b540 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
2b550 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
2b560 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
2b570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b580 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
2b590 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
2b5a0 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
2b5b0 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
2b5c0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2b5d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b5e0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
2b5f0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
2b600 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2b610 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
2b620 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
2b630 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2b640 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2b650 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
2b660 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
2b670 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
2b680 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
2b690 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
2b6a0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
2b6b0 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
2b6c0 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
2b6d0 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
2b6e0 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  C, pSrc, pBuilde
2b6f0 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
2b700 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
2b710 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b720 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
2b730 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
2b740 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2b750 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2b760 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2b770 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
2b780 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
2b790 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2b7a0 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
2b7b0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
2b7c0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
2b7d0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
2b7e0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2b7f0 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
2b800 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
2b810 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
2b820 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b830 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2b840 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
2b850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b860 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
2b870 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
2b880 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
2b890 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
2b8a0 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
2b8b0 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
2b8c0 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
2b8d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2b8e0 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
2b8f0 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
2b900 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
2b910 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2b920 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b930 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2b940 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2b950 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2b960 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2b970 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2b980 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
2b990 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2b9a0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
2b9b0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
2b9c0 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
2b9d0 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
2b9e0 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
2b9f0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
2ba00 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
2ba10 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2ba20 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
2ba30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ba40 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2ba50 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2ba60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
2ba70 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
2ba80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2ba90 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
2baa0 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
2bab0 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
2bac0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2bad0 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
2bae0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2baf0 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
2bb00 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2bb10 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2bb20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2bb40 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
2bb50 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
2bb60 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
2bb70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bb80 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
2bb90 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2bba0 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
2bbb0 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
2bbc0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2bbd0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
2bbe0 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
2bbf0 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
2bc00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2bc10 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
2bc20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2bc30 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2bc40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2bc50 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
2bc60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2bc70 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
2bc80 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
2bc90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2bca0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
2bcb0 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2bcc0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2bcd0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
2bce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bcf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
2bd00 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
2bd10 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
2bd20 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
2bd30 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
2bd40 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2bd50 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2bd60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2bd70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2bd80 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2bd90 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2bda0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
2bdb0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2bdc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2bdd0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2bde0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2bdf0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
2be00 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2be10 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
2be20 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
2be30 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  )2;.    rc = vta
2be40 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2be50 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2be60 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2be70 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2be80 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2be90 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2bea0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2beb0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2bec0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2bed0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2bee0 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2bef0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2bf00 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2bf10 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2bf20 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2bf30 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2bf40 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2bf50 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2bf60 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2bf70 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2bf80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2bf90 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2bfa0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2bfb0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2bfc0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2bfd0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2bfe0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2bff0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2c000 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2c010 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2c020 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2c030 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2c040 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2c050 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2c060 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2c070 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2c090 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2c0a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2c0b0 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2c0c0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2c0d0 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2c0e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2c0f0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2c100 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2c110 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2c120 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
2c130 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
2c140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2c150 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
2c160 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
2c170 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
2c180 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2c190 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
2c1a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
2c1b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2c1c0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
2c1d0 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
2c1e0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2c1f0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
2c200 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
2c210 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2c220 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
2c230 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
2c240 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2c250 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
2c260 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2c270 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
2c280 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2c290 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2c2a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2c2b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2c2c0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2c2d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2c2e0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2c2f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c300 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2c310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c320 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2c330 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2c340 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2c350 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2c360 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2c370 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2c380 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2c390 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2c3a0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2c3b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2c3c0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2c3d0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2c3e0 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2c3f0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2c400 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2c410 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2c420 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2c430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2c450 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2c460 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2c470 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2c480 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2c490 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2c4a0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2c4b0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2c4c0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2c4d0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2c4e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2c4f0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2c500 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2c510 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2c520 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2c530 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2c540 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2c550 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2c560 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2c570 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2c580 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2c590 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2c5a0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2c5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c5c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2c5d0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2c5e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2c5f0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2c600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2c610 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2c620 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2c630 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2c640 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2c650 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2c660 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2c670 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2c680 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2c690 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2c6a0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2c6b0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2c6c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2c6d0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2c6e0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2c6f0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2c700 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78  red = (u8)((pIdx
2c710 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
2c720 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c740 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49          && pIdxI
2c750 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2c760 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65  umed);.      pNe
2c770 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2c780 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2c790 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  = whereCostFromD
2c7a0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2c7b0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2c7c0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2c7d0 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   Every virtual t
2c7e0 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75 72  able query retur
2c7f0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2c800 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c810 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
2c820 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
2c830 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2c840 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2c850 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2c860 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2c870 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2c880 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c890 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2c8a0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2c8b0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c8c0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2c8d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2c8e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2c8f0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2c900 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2c910 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2c920 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2c930 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2c940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2c950 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2c960 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2c970 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2c980 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2c990 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2c9a0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2c9b0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2c9c0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2c9d0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2c9e0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2c9f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2ca00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2ca10 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2ca20 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2ca30 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2ca40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2ca50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2ca60 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2ca70 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2ca80 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2ca90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2caa0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2cab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2cac0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2cad0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2cae0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2caf0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2cb00 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
2cb10 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20  , sCur, sPrev;. 
2cb20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2cb30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
2cb40 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2cb50 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49  ->pWC;.  if( pWI
2cb60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2cb70 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
2cb80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2cb90 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  _OK;.  pWCEnd = 
2cba0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
2cbb0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
2cbc0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 0a 20  uilder->pNew;.. 
2cbd0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2cbe0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
2cbf0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2cc00 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2cc10 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2cc20 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
2cc30 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
2cc40 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
2cc50 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
2cc60 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
2cc70 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
2cc80 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
2cc90 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
2cca0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
2ccb0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
2ccc0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
2ccd0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
2cce0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
2ccf0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2cd00 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
2cd10 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
2cd20 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
2cd30 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
2cd40 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
2cd50 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20  pNew->iTab;.    
2cd60 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2cd70 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2cd80 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
2cd90 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
2cda0 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
2cdb0 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
2cdc0 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
2cdd0 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ur;..      for(p
2cde0 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
2cdf0 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
2ce00 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
2ce10 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
2ce20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2ce30 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
2ce40 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
2ce50 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
2ce60 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
2ce70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
2ce80 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
2ce90 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
2cea0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
2ceb0 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
2cec0 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
2ced0 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
2cee0 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2cef0 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
2cf00 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
2cf10 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
2cf20 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2cf30 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
2cf40 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
2cf50 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
2cf60 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
2cf70 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
2cf80 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
2cf90 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
2cfa0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2cfb0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2cfc0 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
2cfd0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2cfe0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2cff0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d000 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
2d010 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20 20  SubBuild);.     
2d020 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2d030 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75  sCur.n; i++) sCu
2d040 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d  r.a[i].prereq |=
2d050 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 20 20 20   mExtra;.       
2d060 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2d070 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d080 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2d090 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
2d0a0 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
2d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d0c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2d0d0 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
2d0e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
2d0f0 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
2d100 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
2d110 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
2d120 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
2d130 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
2d140 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2d150 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
2d160 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
2d170 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
2d180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d190 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
2d1a0 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
2d1b0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
2d1c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
2d1d0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
2d1e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2d1f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
2d200 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
2d210 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2d220 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
2d230 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
2d240 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
2d250 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 73    whereCostAdd(s
2d280 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
2d290 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
2d2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2d2c0 72 65 43 6f 73 74 41 64 64 28 73 50 72 65 76 2e  reCostAdd(sPrev.
2d2d0 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
2d2e0 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
2d2f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2d320 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
2d330 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
2d340 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2d350 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2d360 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2d370 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
2d380 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2d390 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2d3a0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
2d3b0 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
2d3c0 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
2d3d0 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
2d3e0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
2d3f0 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
2d400 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
2d410 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20  UNING: Multiple 
2d420 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65 20 73  by 3.5 for the s
2d430 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65 20 6c  econdary table l
2d440 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 20  ookup */.       
2d450 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
2d460 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
2d470 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  8;.        pNew-
2d480 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
2d490 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
2d4a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
2d4b0 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
2d4c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2d4d0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2d4e0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2d4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d510 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
2d520 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2d530 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2d540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2d550 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
2d560 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2d570 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
2d580 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2d590 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2d5a0 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  fo;.  Bitmask mE
2d5b0 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d  xtra = 0;.  Bitm
2d5c0 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
2d5d0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
2d5e0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2d5f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2d600 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2d610 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d620 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2d630 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2d640 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62  ->db;.  int nTab
2d650 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  List = pWInfo->n
2d660 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
2d670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
2d680 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20  8 priorJoinType 
2d690 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  = 0;.  WhereLoop
2d6a0 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f   *pNew;..  /* Lo
2d6b0 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
2d6c0 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
2d6d0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
2d6e0 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
2d6f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2d700 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
2d710 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
2d720 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
2d730 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62  st->a; iTab<nTab
2d740 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49  List; iTab++, pI
2d750 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77  tem++){.    pNew
2d760 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
2d770 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
2d780 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
2d790 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
2d7a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2d7b0 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
2d7c0 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a  >jointype|priorJ
2d7d0 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c  oinType) & (JT_L
2d7e0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2d7f0 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72  0 ){.      mExtr
2d800 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  a = mPrior;.    
2d810 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54  }.    priorJoinT
2d820 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69  ype = pItem->joi
2d830 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
2d840 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2d850 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
2d860 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d870 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
2d880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d890 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d8a0 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2d8b0 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2d8c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2d8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d8e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2d8f0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2d900 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2d910 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2d920 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2d930 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2d940 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2d950 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2d960 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2d970 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2d980 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2d990 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2d9a0 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2d9b0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2d9c0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2d9d0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2d9e0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2d9f0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2da00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2da10 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2da20 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2da30 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2da40 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2da50 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
2da60 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
2da70 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
2da80 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
2da90 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
2daa0 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
2dab0 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
2dac0 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
2dad0 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
2dae0 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
2daf0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
2db00 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
2db10 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
2db20 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
2db30 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
2db40 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
2db50 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
2db60 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
2db70 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
2db80 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2db90 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2dba0 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
2dbb0 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
2dbc0 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
2dbd0 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  INT do not requi
2dbe0 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
2dbf0 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
2dc00 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
2dc10 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65  g.** as equivele
2dc20 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
2dc30 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
2dc40 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
2dc50 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
2dc60 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
2dc70 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
2dc80 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
2dc90 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
2dca0 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
2dcb0 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
2dcc0 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
2dcd0 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
2dce0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2dcf0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61   int wherePathSa
2dd00 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2dd10 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2dd20 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2dd30 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2dd40 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2dd50 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2dd60 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2dd70 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2dd80 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2dd90 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2dda0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2ddb0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2ddc0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2ddd0 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2dde0 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2ddf0 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2de00 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2de10 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2de20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2de30 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2de40 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2de50 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2de60 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2de70 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2de80 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2de90 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2dea0 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2deb0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2dec0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2ded0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2dee0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2def0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2df00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2df10 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2df20 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2df40 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2df50 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2df60 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2df70 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2df80 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2df90 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2dfa0 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2dfb0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2dfc0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2dfd0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2dfe0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2dff0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2e000 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2e010 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2e020 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2e030 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2e040 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2e050 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e060 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
2e070 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  n;          /* N
2e080 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2e090 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
2e0a0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
2e0b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e0c0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
2e0d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2e0e0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2e0f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2e100 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
2e110 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
2e120 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
2e130 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2e140 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2e150 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
2e160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e170 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2e180 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
2e190 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
2e1a0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2e1b0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
2e1c0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
2e1d0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
2e1e0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
2e1f0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2e200 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2e210 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2e220 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2e230 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2e240 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2e250 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2e260 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2e270 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2e280 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2e290 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2e2a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2e2b0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2e2c0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2e2d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2e2e0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2e2f0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2e300 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2e310 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2e320 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2e330 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2e340 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2e350 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2e360 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2e370 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2e380 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2e390 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2e3a0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2e3b0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2e3c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2e3d0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2e3e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2e3f0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2e400 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2e410 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2e420 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2e430 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2e440 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2e450 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2e460 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2e470 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2e480 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2e490 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2e4a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2e4b0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2e4c0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2e4d0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2e4e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2e4f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2e500 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2e510 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2e520 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2e530 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2e540 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2e550 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2e560 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2e570 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2e580 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2e590 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2e5a0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2e5b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2e5c0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2e5d0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2e5e0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2e5f0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2e600 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2e610 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2e620 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2e630 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2e640 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2e650 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2e660 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e670 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2e680 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2e690 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2e6a0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2e6b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2e6c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2e6d0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2e6e0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2e6f0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2e700 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2e710 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2e720 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2e730 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2e740 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2e750 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2e760 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2e770 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2e780 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2e790 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2e7a0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2e7b0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2e7c0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2e7d0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2e7e0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2e7f0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2e800 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2e810 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2e820 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2e830 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2e840 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2e850 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2e860 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2e870 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2e880 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2e890 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2e8a0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2e8b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2e8c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2e8d0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2e8e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2e8f0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2e900 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2e910 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2e920 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2e930 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2e940 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2e950 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2e960 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2e970 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2e980 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2e990 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2e9a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2e9b0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2e9c0 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2e9d0 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2e9e0 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2e9f0 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2ea00 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2ea30 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2ea40 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2ea50 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2ea60 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2ea70 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2ea80 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2ea90 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2eaa0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2eab0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2eac0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
2ead0 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
2eae0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2eaf0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
2eb00 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
2eb10 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
2eb20 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
2eb30 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
2eb40 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2eb50 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
2eb60 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
2eb70 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2eb80 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
2eb90 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
2eba0 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
2ebb0 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
2ebc0 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
2ebd0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2ebe0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
2ebf0 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
2ec00 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2ec10 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
2ec20 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
2ec30 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
2ec40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
2ec50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2ec60 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2ec70 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
2ec80 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2ec90 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2eca0 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2ecb0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2ecc0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2ecd0 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2ece0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2ecf0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2ed00 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2ed10 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2ed20 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2ed30 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2ed40 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2ed50 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2ed60 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2ed70 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2ed80 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2ed90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2eda0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2edb0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2edc0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2edd0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2ede0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2edf0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2ee00 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ee10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2ee20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2ee30 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2ee40 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2ee50 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2ee60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ee70 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2ee80 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2ee90 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2eea0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eec0 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2eed0 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2eee0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2eef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ef00 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2ef10 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2ef20 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2ef30 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2ef40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ef50 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2ef60 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2ef70 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2ef80 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2ef90 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2efa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2efb0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2efc0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2efd0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2efe0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2eff0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2f000 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2f010 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2f020 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2f030 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2f040 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2f050 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2f060 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2f070 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2f080 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2f090 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2f0a0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2f0b0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2f0c0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2f0d0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2f0e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2f0f0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2f100 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2f110 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2f120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2f130 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2f140 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
2f150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2f160 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
2f170 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
2f180 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
2f190 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
2f1a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2f1b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f1c0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2f1d0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2f1e0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2f1f0 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2f200 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2f210 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f220 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2f230 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2f240 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2f250 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2f260 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2f270 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2f280 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2f290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2f2a0 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2f2b0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2f2c0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2f2d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f   for(j=0; j<=nCo
2f2e0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2f2f0 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2f300 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2f310 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2f320 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2f330 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2f340 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2f350 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2f360 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2f370 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2f380 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2f390 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2f3a0 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2f3b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2f3c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2f3d0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2f3e0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2f3f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2f400 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f410 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2f420 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2f430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2f440 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2f450 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2f460 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2f470 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2f480 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2f490 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2f4a0 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2f4b0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2f4c0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2f4d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2f4e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f4f0 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20    if( j<nColumn 
2f500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2f510 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c  Normal index col
2f520 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
2f530 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
2f540 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
2f550 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2f560 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
2f570 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
2f580 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2f590 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
2f5a0 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
2f5b0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2f5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f5d0 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f   /* The ROWID co
2f5e0 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20  lumn at the end 
2f5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2f600 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( j==nColumn 
2f610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
2f620 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2f630 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2f640 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2f650 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2f660 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2f670 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2f680 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2f690 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2f6a0 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2f6b0 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20  ll-ordered .    
2f6c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2f6d0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2f6e0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
2f6f0 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
2f700 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
2f710 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2f720 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
2f730 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
2f740 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
2f750 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2f760 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2f770 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2f780 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2f790 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
2f7a0 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
2f7b0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2f7c0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
2f7d0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
2f7e0 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b  dex and and mark
2f7f0 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
2f800 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
2f810 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
2f820 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
2f830 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
2f840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
2f850 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
2f860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f870 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2f880 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2f890 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
2f8a0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2f8b0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2f8c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f8d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2f8e0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2f8f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2f900 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
2f910 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2f920 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f930 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
2f940 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
2f950 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
2f960 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
2f970 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
2f980 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
2f990 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2f9a0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2f9b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f9c0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2f9d0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2f9e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f9f0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2fa00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
2fa10 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
2fa20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fa30 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2fa40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
2fa50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2fa60 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2fa70 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2fa80 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2fa90 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2faa0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2fab0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2fac0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2fad0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
2fae0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
2faf0 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
2fb00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fb10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fb20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
2fb30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2fb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fb50 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
2fb60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2fb70 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2fb80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fb90 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
2fba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2fbb0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2fbc0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2fbd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
2fbe0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2fbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fc00 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2fc10 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2fc20 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2fc30 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2fc40 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2fc50 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2fc60 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2fc70 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2fc80 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2fc90 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2fca0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2fcb0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2fcc0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2fcd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fce0 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2fcf0 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2fd00 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2fd10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2fd20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2fd40 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2fd50 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2fd60 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2fd70 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2fd80 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2fd90 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2fda0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2fdb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2fdc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2fdd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fde0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2fdf0 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2fe00 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2fe10 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  | j<nColumn ){. 
2fe20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2fe30 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2fe40 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
2fe50 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2fe60 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2fe70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fe80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2fe90 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
2fea0 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
2feb0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2fec0 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
2fed0 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
2fee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fef0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
2ff00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
2ff10 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2ff20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2ff30 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
2ff40 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
2ff50 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
2ff60 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
2ff70 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
2ff80 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
2ff90 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2ffa0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
2ffb0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
2ffc0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2ffd0 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
2ffe0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2fff0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
30000 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28   *p;.        if(
30010 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
30020 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
30030 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
30040 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
30050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
30060 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
30070 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
30080 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e   p)&~orderDistin
30090 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
300a0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
300b0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
300c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
300d0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
300e0 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
300f0 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
30100 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
30110 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
30120 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
30130 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
30140 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  1;.  if( !isOrde
30150 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  rDistinct ) retu
30160 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  rn 0;.  return -
30170 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  1;.}..#ifdef WHE
30180 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
30190 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
301a0 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
301b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
301c0 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
301d0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
301e0 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
301f0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
30200 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
30210 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
30220 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
30230 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
30240 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
30250 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
30260 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
30270 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
30280 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
30290 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
302a0 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
302b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
302c0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
302d0 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
302e0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
302f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
30300 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
30310 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
30320 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
30330 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
30340 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
30350 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
30360 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
30370 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
30380 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
30390 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
303a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
303b0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
303c0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
303d0 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
303e0 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
303f0 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
30400 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
30410 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
30420 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
30430 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
30440 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
30450 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
30460 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
30470 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
30480 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
30490 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
304a0 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
304b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68  Info *pWInfo, Wh
304c0 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 29  ereCost nRowEst)
304d0 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
304e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
304f0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
30500 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
30510 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
30520 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30540 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
30550 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
30560 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
30570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30580 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
30590 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
305b0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
305c0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
305d0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
305e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
305f0 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
30600 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
30610 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
30620 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
30630 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
30640 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
30650 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
30660 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61      /* Cost of a
30670 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65 72 65   path */.  Where
30680 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  Cost mxCost = 0;
30690 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
306a0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
306b0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57   of paths */.  W
306c0 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f  hereCost rSortCo
306d0 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
306e0 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74  ost to do a sort
306f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
30700 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
30710 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
30720 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
30730 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
30740 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
30750 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
30760 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
30770 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
30780 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
30790 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
307a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
307b0 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
307c0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
307d0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
307e0 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
307f0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
30800 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
30810 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
30820 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
30830 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
30840 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
30850 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
30860 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
30870 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
30880 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
30890 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
308a0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
308b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
308c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
308d0 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
308e0 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
308f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
30900 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
30910 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
30920 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
30930 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70   routine */..  p
30940 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
30950 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
30960 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
30970 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
30980 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
30990 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
309a0 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
309b0 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
309c0 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
309d0 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
309e0 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
309f0 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
30a00 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
30a10 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
30a20 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
30a30 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
30a40 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29  ice = (nLoop==1)
30a50 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
30a60 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
30a70 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
30a80 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
30a90 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
30aa0 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
30ab0 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e  - begin solver\n
30ac0 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  "));..  /* Alloc
30ad0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
30ae0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
30af0 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
30b00 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
30b10 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
30b20 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
30b30 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
30b40 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
30b50 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
30b60 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
30b70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
30b80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
30b90 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
30ba0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
30bb0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
30bc0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
30bd0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
30be0 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
30bf0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
30c00 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
30c10 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
30c20 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
30c30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
30c40 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
30c50 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
30c60 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
30c70 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
30c80 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
30c90 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
30ca0 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
30cb0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
30cc0 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
30cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
30ce0 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
30cf0 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63  ve 25.  If the c
30d00 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
30d10 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
30d20 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
30d30 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
30d40 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20   the first 25.  
30d50 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
30d60 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
30d70 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
30d80 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
30d90 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
30da0 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20  QueryLoop, 46); 
30db0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
30dc0 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
30dd0 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a  nFrom = 1;..  /*
30de0 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20   Precompute the 
30df0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
30e00 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
30e10 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c   set, if the cal
30e20 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  ler.  ** to sqli
30e30 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
30e40 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62  was concerned ab
30e50 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20  out sorting */. 
30e60 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a   rSortCost = 0;.
30e70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
30e80 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
30e90 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
30ea0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
30eb0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65  dValid = 1;.  }e
30ec0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  lse{.    /* TUNI
30ed0 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
30ee0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73  st of sorting is
30ef0 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65   N*log2(N) where
30f00 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
30f10 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
30f20 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72  t rows. */.    r
30f30 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
30f40 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  st + estLog(nRow
30f50 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54  Est);.    WHERET
30f60 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d  RACE(0x002,("---
30f70 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
30f80 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29  \n", rSortCost))
30f90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
30fa0 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
30fb0 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
30fc0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
30fd0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
30fe0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
30ff0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
31000 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
31010 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
31020 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
31030 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
31040 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
31050 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
31060 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
31070 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
31080 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
31090 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
310a0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
310b0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
310c0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
310d0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
310e0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
310f0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
31100 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
31110 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
31120 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
31130 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  0;.        u8 is
31140 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70  OrderedValid = p
31150 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56  From->isOrderedV
31160 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38  alid;.        u8
31170 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
31180 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
31190 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
311a0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
311b0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
311c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
311d0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
311e0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
311f0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
31200 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
31210 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
31220 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
31230 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
31240 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
31250 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
31260 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
31270 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
31280 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
31290 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
312a0 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
312b0 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
312c0 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72      rCost = wher
312d0 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20  eCostAdd(rCost, 
312e0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20  pFrom->rCost);. 
312f0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
31300 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
31310 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
31320 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
31330 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
31340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
31350 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
31360 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
31370 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
31380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31390 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
313a0 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
313b0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
313e0 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20  , &revMask) ){. 
313f0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
31400 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72  1:  /* Yes.  pFr
31410 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73  om+pWLoop does s
31420 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
31430 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
31440 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31450 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  dered = 1;.     
31460 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31470 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
31480 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
31490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
314a0 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70  se 0:  /* No.  p
314b0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c  From+pWLoop will
314c0 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72   require a separ
314d0 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20  ate sort */.    
314e0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
314f0 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  red = 0;.       
31500 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31510 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
31520 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
31530 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43   whereCostAdd(rC
31540 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
31550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
31560 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
31570 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
31580 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
31590 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
315a0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
315b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
315c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
315d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
315e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
315f0 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
31600 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
31610 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
31620 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
31630 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
31640 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
31650 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
31660 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
31670 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
31680 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
31690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
316a0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
316b0 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e  maskNew && pTo->
316c0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d  isOrderedValid==
316d0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
316e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
316f0 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
31700 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
31710 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31720 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31730 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
31740 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
31750 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
31760 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73   && rCost>=mxCos
31770 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
31780 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
31790 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
317a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
317b0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
317c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
317d0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
317e0 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f 72 64   %s cost=%3d ord
317f0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
31800 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
31810 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
31820 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
31830 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
31840 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
31850 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
31860 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
31870 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
31880 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31890 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
318a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
318b0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
318c0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
318d0 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
318e0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
318f0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
31900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31910 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
31920 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
31930 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
31940 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
31950 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
31960 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
31970 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
31980 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
31990 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
319a0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
319b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
319c0 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54  for(jj=nTo-1; aT
319d0 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f  o[jj].rCost<mxCo
319e0 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72  st; jj--){ asser
319f0 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20  t(jj>0); }.     
31a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31a10 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
31a20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
31a30 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
31a40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
31a50 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
31a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
31a70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31a80 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
31a90 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
31aa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31ab0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
31ac0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
31ad0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31af0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31b00 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
31b10 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
31b20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31b30 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
31b40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31b50 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
31b60 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
31b70 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
31b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
31b90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
31ba0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
31bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31bc0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
31be0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
31bf0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31c10 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
31c20 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
31c30 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
31c40 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31c50 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
31c60 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31c70 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31c80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31c90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
31ca0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
31cb0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31ce0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
31cf0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31d10 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31d20 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
31d30 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31d40 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31d50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31d60 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
31d70 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
31d80 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
31d90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
31da0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31db0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31dc0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
31dd0 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
31de0 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65   /* A new and be
31df0 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61  tter score for a
31e00 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61   previously crea
31e10 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70  ted equivalent p
31e20 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  ath */.#ifdef WH
31e30 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
31e40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
31e50 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
31e60 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
31e70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31e80 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
31e90 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
31ea0 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
31eb0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
31ec0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
31ed0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
31ee0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
31ef0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
31f00 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31f10 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
31f20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31f30 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
31f40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31f50 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f  ntf("  was %s co
31f60 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
31f70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31f80 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31f90 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
31fa0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
31fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31fc0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
31fd0 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
31fe0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
31ff0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
32000 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
32010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32020 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
32030 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
32040 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
32050 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
32060 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
32070 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
32080 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
32090 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
320a0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
320b0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
320c0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72   pTo->nRow = pFr
320d0 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
320e0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
320f0 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
32100 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
32110 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32120 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69   = isOrderedVali
32130 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
32140 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
32150 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
32160 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
32170 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
32180 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
32190 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
321a0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
321b0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
321c0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
321d0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
321e0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
321f0 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
32200 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
32210 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
32220 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
32230 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32240 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
32250 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43  ost>mxCost ) mxC
32260 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
32270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32290 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
322a0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
322b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
322c0 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
322d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
322e0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
322f0 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
32300 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
32310 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
32320 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
32330 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
32340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32350 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
32360 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
32370 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
32380 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
32390 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
323a0 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
323b0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
323c0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
323d0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
323e0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
323f0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
32400 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
32410 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
32420 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73  Valid && pTo->is
32430 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  Ordered ){.     
32440 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32450 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
32460 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
32470 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
32480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32490 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
324a0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
324b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
324c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
324d0 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
324e0 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
324f0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
32500 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
32510 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
32520 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
32530 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
32540 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
32550 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
32560 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
32570 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
32580 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
32590 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
325a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
325b0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
325c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
325d0 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
325e0 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
325f0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
32600 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
32610 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
32620 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
32630 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72  = aFrom;.  asser
32640 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23  t( nFrom==1 );.#
32650 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  if 0 /* The foll
32660 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20  owing is needed 
32670 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76 65 72  if nFrom is ever
32680 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a 2f 0a   more than 1 */.
32690 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
326a0 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
326b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
326c0 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
326d0 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
326e0 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64  om[ii];.  }.#end
326f0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  if.  assert( pWI
32700 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
32710 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
32720 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
32730 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
32740 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
32750 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
32760 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
32770 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
32780 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
32790 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
327a0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
327b0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
327c0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
327d0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
327e0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
327f0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
32800 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
32810 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
32820 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
32830 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
32840 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32850 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
32860 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
32870 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
32880 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
32890 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
328a0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
328b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
328c0 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
328d0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
328e0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
328f0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
32900 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
32910 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
32920 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
32930 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
32940 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
32950 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
32960 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
32970 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
32980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31  );.    if( rc==1
32990 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74   ) pWInfo->eDist
329a0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
329b0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
329c0 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e   }.  if( pFrom->
329d0 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
329e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
329f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32a00 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
32a10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
32a20 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
32a30 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
32a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a50 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
32a60 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 1;.      pWInf
32a70 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
32a80 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
32a90 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
32aa0 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
32ab0 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
32ac0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
32ad0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
32ae0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
32af0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
32b00 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
32b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
32b20 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
32b30 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
32b40 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
32b50 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
32b60 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
32b70 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
32b80 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
32b90 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
32ba0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
32bb0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
32bc0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
32bd0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
32be0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
32bf0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
32c00 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
32c10 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
32c20 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
32c30 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
32c40 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
32c50 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
32c60 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
32c70 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
32c80 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
32c90 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
32ca0 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
32cb0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
32cc0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
32cd0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
32ce0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
32cf0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
32d00 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
32d10 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
32d20 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
32d30 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
32d40 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
32d50 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
32d60 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
32d70 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
32d80 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
32d90 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
32da0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
32db0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
32dc0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
32dd0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
32de0 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
32df0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
32e00 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
32e10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32e20 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
32e30 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
32e40 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
32e50 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
32e60 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
32e70 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
32e80 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
32e90 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
32ea0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
32eb0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
32ec0 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
32ed0 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
32ee0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
32ef0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
32f00 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
32f10 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
32f20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32f30 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
32f40 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
32f50 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
32f60 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
32f70 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  m ){.    pLoop->
32f80 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
32f90 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
32fa0 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
32fb0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
32fc0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
32fd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
32fe0 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
32ff0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
33000 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
33010 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
33020 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
33030 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
33040 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
33050 77 68 65 72 65 43 6f 73 74 28 31 30 29 20 2a 2f  whereCost(10) */
33060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
33070 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
33080 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
33090 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
330a0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
330b0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
330c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
330d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
330e0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
330f0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
33100 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
33110 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  Cur, pIdx->aiCol
33120 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51  umn[j], 0, WO_EQ
33130 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
33140 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
33150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 77  break;.        w
33160 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
33170 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
33180 62 2c 20 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20  b, pLoop, j);.  
33190 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
331a0 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
331b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
331c0 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( j!=pIdx->nColu
331d0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
331e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
331f0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
33200 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
33210 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
33220 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 74  ;.      if( (pIt
33230 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  em->colUsed & ~c
33240 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49  olumnsInIndex(pI
33250 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dx))==0 ){.     
33260 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
33270 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
33280 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
33290 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
332a0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
332b0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
332c0 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
332d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
332e0 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a  = pIdx;.      /*
332f0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
33300 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
33310 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a  lookup is 15 */.
33320 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75        pLoop->rRu
33330 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d  n = 39;  /* 39==
33340 77 68 65 72 65 43 6f 73 74 28 31 35 29 20 2a 2f  whereCost(15) */
33350 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
33360 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
33370 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
33380 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
33390 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31 3b 0a  = (WhereCost)1;.
333a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
333b0 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
333c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
333d0 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
333e0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
333f0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
33400 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
33410 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
33420 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
33430 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
33440 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
33450 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20  Info->bOBSat =  
33460 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
33470 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
33480 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
33490 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
334a0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
334b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
334c0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
334d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
334e0 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
334f0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
33500 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
33510 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
33520 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
33530 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
33540 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
33550 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
33560 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
33570 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
33580 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
33590 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
335a0 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
335b0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
335c0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
335d0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
335e0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
335f0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
33600 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
33610 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
33620 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
33630 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
33640 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
33650 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
33660 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
33670 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
33680 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
33690 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
336a0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
336b0 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
336c0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
336d0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
336e0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
336f0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
33700 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
33710 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
33720 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
33730 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
33740 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
33750 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
33760 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
33770 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
33780 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
33790 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
337a0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
337b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
337c0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
337d0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
337e0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
337f0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
33800 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
33810 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
33820 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
33830 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
33840 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
33850 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
33860 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
33870 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
33880 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
33890 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
338a0 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
338b0 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
338c0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
338d0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
338e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
338f0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
33900 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33920 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
33930 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
33940 2a 20 20 20 20 20 20 65 6e 64 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 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
33970 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
33980 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
33990 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
339a0 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
339b0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
339c0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
339d0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
339e0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
339f0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
33a00 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
33a10 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
33a20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
33a30 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
33a40 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
33a50 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
33a60 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
33a70 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
33a80 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
33a90 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
33aa0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
33ab0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
33ac0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
33ad0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
33ae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
33af0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
33b00 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
33b10 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
33b20 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
33b30 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
33b40 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
33b50 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
33b60 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
33b70 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
33b80 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
33b90 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
33ba0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
33bb0 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
33bc0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
33bd0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
33be0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
33bf0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
33c00 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
33c10 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
33c20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
33c30 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
33c40 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
33c50 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
33c60 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
33c70 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
33c80 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
33c90 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
33ca0 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
33cb0 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
33cc0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
33cd0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
33ce0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
33cf0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
33d00 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
33d10 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
33d20 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
33d30 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
33d40 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
33d50 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
33d60 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
33d70 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
33d80 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
33d90 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
33da0 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
33db0 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
33dc0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
33dd0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
33de0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
33df0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
33e00 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
33e10 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
33e20 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
33e30 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
33e40 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
33e50 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
33e60 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
33e70 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
33e80 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
33e90 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
33ea0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33eb0 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
33ec0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
33ed0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
33ee0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
33ef0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
33f00 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
33f10 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
33f20 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
33f30 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
33f40 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
33f50 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
33f60 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
33f70 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
33f80 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
33f90 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
33fa0 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
33fb0 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
33fc0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
33fd0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
33fe0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
33ff0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
34000 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
34010 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
34020 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
34030 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
34040 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
34050 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
34060 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
34070 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
34080 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
34090 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
340a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
340b0 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
340c0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
340d0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
340e0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
340f0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
34100 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
34110 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
34120 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
34130 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
34140 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
34150 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
34160 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
34170 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
34180 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
34190 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
341a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
341b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
341c0 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
341d0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
341e0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
341f0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
34200 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
34210 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
34220 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
34230 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
34240 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
34250 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
34260 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
34270 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
34280 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
34290 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
342a0 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
342b0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
342c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
342d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
342e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
342f0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
34300 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
34310 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
34320 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
34330 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
34340 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
34350 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
34360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
34370 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
34380 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
34390 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
343a0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72  ER BY clause, or
343b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
343c0 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
343d0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f   /* Result set o
343e0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
343f0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
34400 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
34410 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
34420 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
34430 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
34440 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
34450 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
34460 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
34470 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
34480 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
34490 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
344a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
344b0 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
344c0 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
344d0 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
344e0 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
344f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34500 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
34510 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
34520 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
34530 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
34540 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
34550 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
34560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
34570 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
34580 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
34590 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
345a0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
345b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
345c0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
345d0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
345e0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
345f0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
34600 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
34610 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
34620 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
34630 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
34640 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
34650 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
34660 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
34670 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
34680 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
34690 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
346a0 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
346b0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
346c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
346d0 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
346e0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
346f0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
34700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34710 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
34720 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
34730 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
34740 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
34750 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
34760 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34770 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
34780 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a  n code */...  /*
34790 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
347a0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
347b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
347c0 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
347d0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
347e0 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
347f0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
34800 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
34810 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
34820 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
34830 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
34840 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
34850 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
34860 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
34870 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
34880 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
34890 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
348a0 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
348b0 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
348c0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
348d0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
348e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
348f0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
34900 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
34910 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
34920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
34930 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
34940 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
34950 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
34960 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
34970 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
34980 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
34990 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
349a0 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
349b0 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
349c0 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
349d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
349e0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
349f0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
34a00 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
34a10 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
34a20 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
34a30 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
34a40 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
34a50 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
34a60 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
34a70 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
34a80 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
34a90 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
34aa0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
34ab0 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
34ac0 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
34ad0 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
34ae0 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
34af0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
34b00 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
34b10 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
34b20 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
34b30 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
34b40 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
34b50 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
34b60 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
34b70 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
34b80 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
34b90 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
34ba0 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
34bb0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
34bc0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
34bd0 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
34be0 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
34bf0 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
34c00 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
34c10 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
34c20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
34c30 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
34c40 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
34c50 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
34c60 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
34c70 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
34c80 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
34c90 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
34ca0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
34cb0 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
34cc0 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
34cd0 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
34ce0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
34cf0 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
34d00 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
34d10 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
34d20 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
34d30 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
34d40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
34d50 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
34d60 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
34d70 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
34d80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
34d90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
34da0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
34db0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
34dc0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
34dd0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
34de0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
34df0 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
34e00 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
34e10 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
34e20 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
34e30 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
34e40 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
34e50 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52  By;.  pWInfo->pR
34e60 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75  esultSet = pResu
34e70 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  ltSet;.  pWInfo-
34e80 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
34e90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
34ea0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
34eb0 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
34ec0 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
34ed0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
34ee0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
34ef0 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74  Loop;.  pMaskSet
34f00 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
34f10 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
34f20 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
34f30 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
34f40 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
34f50 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
34f60 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
34f70 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
34f80 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
34f90 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
34fa0 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
34fb0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
34fc0 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
34fd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
34fe0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
34ff0 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
35000 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
35010 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
35020 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
35030 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
35040 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
35050 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
35060 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
35070 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
35080 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
35090 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
350a0 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
350b0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
350c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
350d0 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
350e0 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
350f0 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
35100 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
35110 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ND);   /* IMP: R
35120 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a  -15842-53296 */.
35130 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
35140 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
35150 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
35160 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
35170 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20  fier Goto */.   
35180 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
35190 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
351a0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
351b0 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
351c0 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
351d0 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
351e0 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
351f0 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
35200 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
35210 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
35220 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
35230 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
35240 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
35250 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
35260 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
35270 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
35280 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
35290 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
352a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
352b0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
352c0 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
352d0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
352e0 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
352f0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
35300 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  y ) pWInfo->bOBS
35310 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  at = 1;.    if( 
35320 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35330 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35340 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
35350 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
35360 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
35370 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  QUE;.    }.  }..
35380 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
35390 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
353a0 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
353b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
353c0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
353d0 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
353e0 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
353f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
35400 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
35410 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
35420 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
35430 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
35440 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
35450 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
35460 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
35470 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
35480 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
35490 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
354a0 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
354b0 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
354c0 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
354d0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
354e0 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
354f0 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
35500 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
35510 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
35520 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
35530 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
35540 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
35550 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
35560 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
35570 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
35580 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
35590 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
355a0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
355b0 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
355c0 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
355d0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
355e0 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
355f0 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
35600 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
35610 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  15..  **.  ** No
35620 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
35630 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
35640 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
35650 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
35660 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
35670 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
35680 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
35690 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
356a0 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
356b0 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
356c0 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
356d0 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
356e0 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
356f0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
35700 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
35710 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
35720 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
35730 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61   ii++){.    crea
35740 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
35750 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
35760 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  .iCursor);.  }.#
35770 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
35780 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
35790 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
357a0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
357b0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
357c0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  ++){.      Bitma
357d0 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk m = getMask(p
357e0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
357f0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
35800 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
35810 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
35820 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
35830 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
35840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
35850 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
35860 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
35870 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
35880 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
35890 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
358a0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
358b0 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
358c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
358d0 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
358e0 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
358f0 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
35900 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
35910 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
35920 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
35930 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
35940 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
35950 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
35960 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
35970 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
35980 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
35990 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
359a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
359b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
359c0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
359d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
359e0 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20  he ORDER BY (or 
359f0 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65  GROUP BY) clause
35a00 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65   contains refere
35a10 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a  nces to general.
35a20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
35a30 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20  , then we won't 
35a40 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73  be able to satis
35a50 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69  fy it using indi
35a60 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20  ces, so.  ** go 
35a70 61 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c  ahead and disabl
35a80 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
35a90 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
35aa0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
35ab0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35ac0 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  CT)!=0 ){.    fo
35ad0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65  r(ii=0; ii<pOrde
35ae0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
35af0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
35b00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
35b10 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
35b20 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45  rderBy->a[ii].pE
35b30 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
35b40 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
35b50 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
35b60 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
35b70 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   = pOrderBy = 0;
35b80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35b90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35ba0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
35bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
35bc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
35bd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72  .  }..  if( wctr
35be0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
35bf0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
35c00 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
35c10 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
35c20 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
35c30 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
35c40 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
35c50 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
35c60 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
35c70 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
35c80 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
35c90 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35ca0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35cb0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
35cc0 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
35cd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
35ce0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
35cf0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
35d00 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
35d10 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
35d20 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
35d30 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
35d40 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
35d50 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
35d60 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
35d70 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
35d80 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
35d90 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
35da0 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54  ects */.  WHERET
35db0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
35dc0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
35dd0 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  t ***\n"));.  if
35de0 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
35df0 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
35e00 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
35e10 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
35e20 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
35e30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
35e40 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35e50 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61    .    /* Displa
35e60 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
35e70 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69  reLoop objects i
35e80 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20  f wheretrace is 
35e90 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65  enabled */.#ifde
35ea0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
35eb0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
35ec0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
35ed0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
35ee0 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
35ef0 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
35f00 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
35f10 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
35f20 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
35f30 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
35f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
35f60 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
35f70 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20  RSTUVWYXZ";.    
35f80 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
35f90 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20  pLoops, i=0; p; 
35fa0 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  p=p->pNextLoop, 
35fb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  i++){.        p-
35fc0 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25  >cId = zLabel[i%
35fd0 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
35fe0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
35ff0 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c  opPrint(p, pTabL
36000 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
36010 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
36020 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
36030 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
36040 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
36050 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
36060 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
36070 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
36080 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
36090 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
360a0 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
360b0 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20  ->nRowOut+1);.  
360c0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
360d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
360e0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
360f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
36100 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
36110 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c  By==0 && (db->fl
36120 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
36130 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b  erseOrder)!=0 ){
36140 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65  .     pWInfo->re
36150 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b  vMask = (Bitmask
36160 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )(-1);.  }.  if(
36170 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
36180 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
36190 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
361a0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
361b0 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
361c0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
361d0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
361e0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
361f0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73     int ii;.    s
36200 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36210 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e  f("---- Solution
36220 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66   nRow=%d", pWInf
36230 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20  o->nRowOut);.   
36240 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42   if( pWInfo->bOB
36250 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Sat ){.      sql
36260 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36270 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c 78  " ORDERBY=0x%llx
36280 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  ", pWInfo->revMa
36290 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
362a0 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65  witch( pWInfo->e
362b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
362c0 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
362d0 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
362e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
362f0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
36300 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b  STINCT=unique");
36310 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
36330 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
36340 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20  T_ORDERED: {.   
36350 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
36360 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
36370 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20  NCT=ordered");. 
36380 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36390 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
363a0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
363b0 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20  UNORDERED: {.   
363c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
363d0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
363e0 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b  NCT=unordered");
363f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36410 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
36420 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
36430 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49  for(ii=0; ii<pWI
36440 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b  nfo->nLevel; ii+
36450 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  +){.      whereL
36460 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d  oopPrint(pWInfo-
36470 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70  >a[ii].pWLoop, p
36480 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
36490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
364a0 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20  Attempt to omit 
364b0 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20  tables from the 
364c0 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74  join that do not
364d0 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75   effect the resu
364e0 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  lt */.  if( pWIn
364f0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20  fo->nLevel>=2.  
36500 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d   && pResultSet!=
36510 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
36520 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
36530 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a  SQLITE_OmitNoopJ
36540 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69  oin).  ){.    Bi
36550 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20  tmask tabUsed = 
36560 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
36570 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
36580 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
36590 28 20 70 4f 72 64 65 72 42 79 20 29 20 74 61 62  ( pOrderBy ) tab
365a0 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73 74  Used |= exprList
365b0 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
365c0 53 65 74 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  Set, pOrderBy);.
365d0 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
365e0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
365f0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
36600 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
36610 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
36620 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
36630 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
36640 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
36650 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
36660 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69  pLoop->iTab].joi
36670 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
36680 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
36690 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
366a0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
366b0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
366c0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
366d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
366e0 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
366f0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
36700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36710 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
36720 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
36730 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36740 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
36750 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
36760 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
36770 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
36780 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
36790 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
367a0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
367b0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
367c0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
367d0 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
367e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
367f0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
36800 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
36810 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
36820 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
36830 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
36840 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
36850 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
36860 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
36870 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
36880 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
36890 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
368a0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
368b0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
368c0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
368d0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
368e0 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
368f0 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
36900 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
36910 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
36920 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
36930 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
36940 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
36950 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
36960 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
36970 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
36980 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
36990 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
369a0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
369b0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
369c0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
369d0 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
369e0 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
369f0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
36a00 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
36a10 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
36a20 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
36a30 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
36a40 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36a50 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
36a60 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
36a70 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
36a80 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
36a90 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
36aa0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
36ab0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
36ac0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
36ad0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36ae0 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
36af0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36b00 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
36b10 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
36b20 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
36b30 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
36b40 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
36b50 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
36b60 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
36b70 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
36b80 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
36b90 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
36ba0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
36bb0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
36bc0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
36bd0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
36be0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
36bf0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
36c00 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
36c10 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
36c20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
36c30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
36c40 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
36c50 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
36c60 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
36c70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
36c80 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
36c90 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
36ca0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
36cb0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
36cc0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
36cd0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
36ce0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
36cf0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
36d00 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
36d10 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
36d20 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
36d30 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
36d40 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
36d50 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
36d60 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
36d70 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
36d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36d90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36da0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
36db0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36dc0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
36dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
36de0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
36df0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
36e00 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
36e10 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
36e20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
36e30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
36e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36e50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
36e60 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
36e70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
36e80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
36e90 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
36ea0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
36eb0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
36ec0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
36ed0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36ee0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
36ef0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
36f00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36f10 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
36f20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
36f30 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
36f40 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
36f50 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
36f60 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
36f70 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
36f80 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
36f90 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
36fa0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
36fb0 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
36fc0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
36fd0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
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 20 29 3b 0a 20 20 20 20  Col==BMS );.    
37020 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
37030 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
37040 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
37050 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
37060 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
37070 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
37080 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
37090 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
370a0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
370b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
370c0 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
370d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
370e0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
370f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37100 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
37110 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
37120 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37130 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
37140 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37150 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
37160 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
37170 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
37180 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
37190 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Name);.    }.#if
371a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
371b0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
371c0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
371d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
371e0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
371f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
37200 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
37210 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
37220 2d 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  ->sWC, pTabItem,
37230 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
37240 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  l);.    }else.#e
37250 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 6f  ndif.    if( pLo
37260 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37270 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
37280 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
37290 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
372a0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b  .pIndex;.      K
372b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
372c0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
372d0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
372e0 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  .      /* FIXME:
372f0 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
37300 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65  tion use pTabIte
37310 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48  m->iCursor if WH
37320 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_IDX_ONLY */.
37330 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
37340 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
37350 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  dxCur = iIdxCur 
37360 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72  ? iIdxCur : pPar
37370 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
37380 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
37390 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
373a0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
373b0 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
373c0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
373d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
373e0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
373f0 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
37400 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
37410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37420 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
37430 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
37440 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
37450 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
37460 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
37470 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
37480 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
37490 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
374a0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
374b0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
374c0 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  sMaskSet, pTabIt
374d0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
374e0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
374f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
37500 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
37510 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
37520 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
37530 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
37540 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
37550 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
37560 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
37570 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
37580 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
37590 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
375a0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
375b0 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
375c0 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
375d0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
375e0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
375f0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
37600 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
37610 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
37620 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
37630 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
37640 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
37650 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
37660 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
37670 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e  trlFlags);.    n
37680 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e  otReady = codeOn
37690 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
376a0 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
376b0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
376c0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
376d0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
376e0 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20  .  /* Done. */. 
376f0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
37700 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
37710 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
37720 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
37730 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
37740 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
37750 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
37760 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
37770 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
37780 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
37790 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
377a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
377b0 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
377c0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
377d0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
377e0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
377f0 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
37800 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
37810 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
37820 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
37830 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
37840 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
37850 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
37860 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
37870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
37880 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
37890 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
378a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
378b0 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
378c0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
378d0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
378e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
378f0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
37900 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
37910 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
37920 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
37930 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
37940 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
37950 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
37960 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
37970 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
37980 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
37990 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
379a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
379b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
379c0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
379d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
379e0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
379f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
37a00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
37a10 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
37a20 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
37a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37a40 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
37a50 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
37a60 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
37a70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37a80 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
37a90 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
37aa0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
37ab0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
37ac0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
37ad0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37ae0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
37af0 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
37b00 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
37b10 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
37b20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
37b30 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
37b40 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
37b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
37b60 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
37b70 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
37b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37b90 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
37ba0 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
37bb0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
37bc0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
37bd0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
37be0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
37bf0 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  InTop-1);.      
37c00 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
37c10 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
37c20 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
37c30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
37c40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
37c50 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
37c60 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
37c70 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
37c80 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
37c90 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
37ca0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
37cb0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
37cc0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
37cd0 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
37ce0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
37cf0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
37d00 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
37d10 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73     || (pLoop->ws
37d20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
37d30 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
37d40 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
37d50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37d60 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
37d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37d80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
37d90 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
37da0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
37db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37dc0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
37dd0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
37de0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
37df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37e00 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
37e10 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
37e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37e30 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
37e40 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
37e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37e60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
37e70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
37e80 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
37e90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
37ec0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
37ed0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
37ee0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
37ef0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
37f00 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
37f10 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
37f20 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
37f30 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
37f40 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
37f50 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
37f60 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
37f70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
37f80 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
37f90 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
37fa0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
37fb0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
37fc0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
37fd0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
37fe0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  */.  assert( pWI
37ff0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61  nfo->nLevel<=pTa
38000 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
38010 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
38020 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
38030 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
38040 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
38050 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
38060 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
38070 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
38080 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
38090 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
380a0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
380b0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
380c0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
380d0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
380e0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
380f0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
38100 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
38110 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
38120 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
38130 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
38140 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
38150 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
38160 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
38170 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
38180 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
38190 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
381a0 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
381b0 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26  OnePass && (ws &
381c0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
381d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
381e0 71 6c 69 74 65 33 56 64 62 65 41