/ Hex Artifact Content
Login

Artifact 927acb798c66af64b5d640e50f0edfe07d6b4085:


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 56 61 6c 75 65 28 70 52 65  VdbeGetValue(pRe
a9f0: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
aa00: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
aa10: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
aa20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
aa30: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
aa40: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
aa50: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
aa60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
aa70: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
aa80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
aa90: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
aaa0: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
aab0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
aac0: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
aad0: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
aae0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
aaf0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
ab00: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
ab10: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
ab20: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
ab30: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
ab40: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
ab50: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
ab60: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
ab70: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
ab80: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
ab90: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
aba0: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
abb0: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
abc0: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
abd0: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
abe0: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
abf0: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
ac00: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
ac10: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
ac20: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
ac30: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
ac40: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
ac50: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
ac60: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
ac70: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
ac80: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
ac90: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
aca0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
acb0: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
acc0: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
acd0: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
ace0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
acf0: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
ad00: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
ad10: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
ad20: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ad30: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
ad40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
ad50: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
ad60: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
ad70: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
ad80: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
ad90: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
ada0: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
adb0: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
adc0: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
add0: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
ade0: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
adf0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
ae00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
ae10: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
ae20: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
ae30: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
ae40: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
ae50: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
ae60: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
ae70: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
ae80: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
ae90: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
aea0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
aeb0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
aec0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
aed0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
aee0: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
aef0: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
af00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af10: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
af20: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
af30: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
af40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
af50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
af60: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
af70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
af80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
af90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
afa0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
afb0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
afc0: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
afd0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
afe0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
aff0: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
b000: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b010: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
b020: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
b030: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
b040: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
b050: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
b060: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
b070: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
b080: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
b090: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
b0a0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
b0b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
b0c0: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
b0d0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
b0e0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
b0f0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
b100: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
b110: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
b120: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
b130: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b140: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b150: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
b160: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
b170: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
b180: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
b190: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b1a0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
b1b0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
b1c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b1d0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
b1e0: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
b1f0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
b200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
b210: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
b220: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b230: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
b240: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
b250: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
b260: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
b270: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
b280: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
b290: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
b2a0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b2b0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
b2c0: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
b2d0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
b2e0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
b2f0: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
b300: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
b310: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
b320: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
b330: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
b340: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
b350: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
b360: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
b370: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
b380: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b390: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b3a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b3b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b3c0: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
b3d0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
b3e0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
b3f0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
b400: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
b410: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
b420: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
b430: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
b440: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
b450: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
b480: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
b490: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
b4a0: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
b4b0: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
b4c0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
b4d0: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
b4e0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
b4f0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
b500: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
b510: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
b520: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
b530: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
b540: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
b550: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
b560: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
b570: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
b580: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
b590: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b5a0: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
b5b0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
b5c0: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b5d0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
b5e0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
b5f0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
b600: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
b610: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
b620: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
b630: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
b640: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
b650: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
b660: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
b670: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
b680: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
b690: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
b6a0: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
b6b0: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
b6c0: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
b6d0: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
b6e0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
b6f0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
b700: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
b710: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
b720: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
b730: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
b740: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
b750: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
b760: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
b770: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
b780: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
b790: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
b7a0: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
b7b0: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
b7c0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b7d0: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
b7e0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
b7f0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
b800: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
b810: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
b820: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
b830: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b840: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b850: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b860: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b870: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b880: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b890: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b8a0: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b8b0: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b8c0: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b8d0: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b8e0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b8f0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b900: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b910: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b920: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b930: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b940: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b950: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b960: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b970: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b980: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b990: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b9a0: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b9b0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b9c0: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b9d0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b9e0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b9f0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
ba00: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
ba10: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
ba20: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
ba30: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
ba40: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
ba50: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
ba60: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
ba70: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
ba80: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
ba90: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
baa0: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
bab0: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
bac0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
bad0: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
bae0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
baf0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
bb00: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
bb10: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
bb20: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
bb30: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
bb40: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
bb50: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
bb60: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
bb70: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
bb80: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
bb90: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
bba0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
bbb0: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
bbc0: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
bbd0: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
bbe0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
bbf0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
bc00: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
bc10: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
bc20: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
bc30: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
bc40: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
bc50: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
bc60: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
bc70: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
bc80: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
bc90: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
bca0: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
bcb0: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
bcc0: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
bcd0: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
bce0: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
bcf0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
bd00: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
bd10: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
bd20: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
bd30: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
bd40: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
bd50: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
bd60: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
bd70: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
bd80: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
bd90: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
bda0: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
bdb0: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
bdc0: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
bdd0: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
bde0: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
bdf0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
be00: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
be10: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
be20: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
be30: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
be40: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
be50: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
be60: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
be70: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
be80: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
be90: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
bea0: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
beb0: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
bec0: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
bed0: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
bee0: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
bef0: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
bf00: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
bf10: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
bf20: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
bf30: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
bf40: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
bf50: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
bf60: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
bf70: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
bf80: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
bf90: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
bfa0: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
bfb0: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
bfc0: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
bfd0: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
bfe0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
bff0: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
c000: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
c010: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
c020: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
c030: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
c040: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
c050: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
c060: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
c070: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
c080: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
c090: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
c0a0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
c0b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
c0c0: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
c0d0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
c0e0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
c0f0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
c100: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
c110: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
c120: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c130: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c140: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
c150: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
c160: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
c170: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c180: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c1a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c1b0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c1c0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c1d0: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
c1e0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c1f0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
c200: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
c210: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
c220: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c230: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
c240: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c280: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c290: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
c2a0: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
c2b0: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
c2c0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
c2d0: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
c2e0: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
c2f0: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
c300: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
c310: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
c320: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
c330: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
c340: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
c350: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
c360: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
c370: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
c380: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
c390: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
c3a0: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
c3b0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c3c0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
c3d0: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
c3e0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
c3f0: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
c400: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
c410: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
c420: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
c430: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
c440: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
c450: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
c460: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
c470: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
c480: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
c490: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
c4a0: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
c4b0: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
c4c0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
c4d0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
c4e0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
c4f0: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
c500: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c510: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
c520: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
c530: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
c540: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c550: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c560: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
c570: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
c580: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
c590: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c5a0: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
c5b0: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
c5c0: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
c5d0: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
c5e0: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
c5f0: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
c600: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
c610: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c620: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
c630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
c640: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c650: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
c660: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
c670: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
c680: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
c690: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
c6a0: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
c6b0: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
c6c0: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
c6d0: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
c6e0: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
c6f0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
c700: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
c710: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
c720: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c730: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
c740: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c750: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
c760: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
c770: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
c780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
c790: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c7a0: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
c7b0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
c7c0: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
c7d0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
c7e0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
c7f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
c800: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
c810: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
c820: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
c830: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c840: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c850: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c860: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c870: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c880: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c890: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c8a0: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c8b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c8c0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c8d0: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
c8e0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
c8f0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
c900: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
c910: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
c920: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
c930: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
c940: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
c950: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
c960: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
c970: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
c980: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
c990: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c9a0: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
c9b0: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
c9c0: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
c9d0: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
c9e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c9f0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
ca00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ca10: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
ca20: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
ca30: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
ca40: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
ca50: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
ca60: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
ca70: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
ca80: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
ca90: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
caa0: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
cab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
cac0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cad0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cae0: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
caf0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
cb00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
cb10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb20: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
cb30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cb40: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
cb50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
cb60: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
cb70: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
cb80: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
cb90: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
cba0: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
cbb0: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
cbc0: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
cbd0: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
cbe0: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
cbf0: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
cc00: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cc10: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
cc20: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
cc30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
cc40: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
cc50: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
cc60: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cc70: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
cc80: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
cc90: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
cca0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
ccb0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
ccc0: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
ccd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
cce0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
ccf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
cd00: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
cd10: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
cd20: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cd30: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
cd40: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
cd50: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
cd60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cd70: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
cd80: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cd90: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
cda0: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
cdb0: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
cdc0: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
cdd0: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
cde0: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
cdf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
ce00: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
ce10: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
ce20: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
ce30: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
ce40: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
ce50: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
ce60: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
ce70: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
ce80: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
ce90: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
cea0: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
ceb0: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
cec0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
ced0: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
cee0: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
cef0: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
cf00: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
cf10: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
cf20: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
cf30: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
cf40: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
cf50: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
cf60: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
cf70: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
cf80: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
cf90: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
cfa0: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
cfb0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
cfc0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
cfd0: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
cfe0: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
cff0: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
d000: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
d010: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
d020: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
d030: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
d040: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
d050: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
d060: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
d070: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
d080: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
d090: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
d0a0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
d0b0: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
d0c0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
d0d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
d0e0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
d0f0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
d100: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
d110: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
d120: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
d130: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
d140: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
d150: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
d160: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
d170: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
d180: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
d190: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
d1a0: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
d1b0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
d1c0: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
d1d0: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
d1e0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
d1f0: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
d200: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
d210: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
d220: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
d230: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
d240: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
d250: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
d260: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
d270: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
d280: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
d290: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
d2a0: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
d2b0: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
d2c0: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
d2d0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
d2e0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
d2f0: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
d300: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d310: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
d320: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
d330: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
d340: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
d350: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d380: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
d390: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
d3a0: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
d3b0: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
d3c0: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
d3d0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
d3e0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
d3f0: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
d400: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d410: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
d420: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
d430: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
d440: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
d450: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
d460: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
d470: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
d480: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
d490: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
d4a0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
d4b0: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
d4c0: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
d4d0: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
d4e0: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
d4f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
d500: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
d510: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
d520: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
d530: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
d540: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
d550: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d560: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d570: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d580: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d590: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
d5a0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
d5b0: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
d5c0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
d5d0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d5e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
d5f0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
d600: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
d610: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
d620: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
d630: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
d640: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
d650: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
d660: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
d670: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
d680: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d690: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
d6a0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d6b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d6c0: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
d6d0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
d6e0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
d6f0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
d700: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d710: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
d720: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
d730: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
d740: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
d750: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
d760: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
d770: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
d780: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
d790: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
d7a0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
d7b0: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
d7c0: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
d7d0: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
d7e0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
d7f0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
d800: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
d810: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d820: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d830: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d840: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d850: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d860: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d870: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d880: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d890: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d8a0: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d8b0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d8c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d8d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d8e0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d8f0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
d900: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
d910: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
d920: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
d930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d940: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d950: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
d960: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
d970: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
d980: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
d990: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
d9a0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
d9b0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
d9c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d9d0: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
d9e0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
d9f0: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
da00: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
da10: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
da20: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
da30: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
da40: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
da50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
da60: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
da70: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
da80: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
da90: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
daa0: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
dab0: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
dac0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
dad0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
dae0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
daf0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
db00: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
db10: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
db20: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
db30: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
db40: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
db50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
db60: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
db70: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
db80: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
db90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
dba0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
dbb0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
dbc0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
dbd0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
dbe0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
dbf0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
dc00: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
dc10: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
dc20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
dc30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
dc40: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
dc50: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
dc60: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
dc70: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
dc80: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
dc90: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
dca0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
dcb0: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
dcc0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
dcd0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
dce0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
dcf0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
dd00: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
dd10: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
dd20: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
dd30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
dd40: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
dd50: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
dd60: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dd70: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
dd80: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
dd90: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
dda0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
ddb0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
ddc0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
ddd0: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
dde0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
ddf0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
de00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
de10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
de20: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
de30: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
de40: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
de50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
de60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
de70: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
de80: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
de90: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
dea0: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
deb0: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
dec0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
ded0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
dee0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
def0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
df00: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
df10: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
df20: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
df30: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
df40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
df50: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
df60: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
df70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
df80: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
df90: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
dfa0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
dfb0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
dfc0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
dfd0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
dfe0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
dff0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
e000: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
e010: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
e020: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
e030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e040: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
e050: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
e060: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
e070: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
e080: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
e090: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
e0a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
e0b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e0c0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
e0d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
e0e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
e0f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e100: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
e110: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e120: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
e130: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
e140: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e150: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
e160: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
e170: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
e180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
e190: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
e1a0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
e1b0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e1c0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e1d0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
e1e0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
e1f0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
e200: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
e210: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
e220: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
e230: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
e240: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e250: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e260: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
e270: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e280: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
e290: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
e2a0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
e2b0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
e2c0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
e2d0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
e2e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e2f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
e300: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
e310: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
e320: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
e330: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
e340: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
e350: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e360: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
e370: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
e380: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
e390: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e3a0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
e3b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
e3c0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
e3d0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e3e0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e3f0: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
e400: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
e410: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
e420: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e430: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
e440: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
e450: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e460: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
e470: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
e480: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
e490: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
e4a0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
e4b0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
e4c0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
e4d0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e4e0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
e4f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
e500: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
e510: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
e520: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
e530: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
e540: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
e550: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
e560: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
e570: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e580: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
e590: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
e5a0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
e5b0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
e5c0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
e5d0: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
e5e0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
e5f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e600: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
e610: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
e620: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
e630: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
e640: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
e650: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
e660: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e670: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
e680: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
e690: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
e6a0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
e6b0: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
e6c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
e6d0: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
e6e0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
e6f0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
e700: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
e710: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
e720: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
e730: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
e740: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
e750: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e760: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
e770: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
e780: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
e790: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
e7a0: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
e7b0: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
e7c0: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
e7d0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
e7e0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
e7f0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
e800: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
e810: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
e820: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
e830: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e840: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e850: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e860: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e870: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e880: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e890: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e8a0: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e8b0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e8c0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e8d0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e8e0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
e8f0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e900: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
e910: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
e920: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e930: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
e940: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
e950: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e960: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e970: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
e980: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
e990: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e9a0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e9c0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e9d0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
e9e0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e9f0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
ea00: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
ea10: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
ea20: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea40: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ea50: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ea60: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
ea70: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
ea80: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
ea90: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
eaa0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
eab0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
eac0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ead0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
eae0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
eaf0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
eb00: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
eb10: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
eb20: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
eb30: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
eb40: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
eb60: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
eb70: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
eb80: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eba0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
ebb0: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
ebc0: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
ebd0: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
ebe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
ebf0: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
ec00: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
ec10: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ec40: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
ec50: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
ec60: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
ec70: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
ec80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ec90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eca0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
ecb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ecc0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ecd0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ece0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ecf0: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ed00: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ed10: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
ed20: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
ed30: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
ed40: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
ed50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
ed60: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
ed70: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
ed80: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
ed90: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
eda0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
edb0: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
edc0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
edd0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ede0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
edf0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ee00: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ee10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ee20: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ee30: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ee40: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
ee50: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
ee60: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ee70: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
ee80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
ee90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
eea0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
eeb0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
eec0: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
eed0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
eee0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
eef0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
ef00: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
ef10: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
ef20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
ef30: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ef40: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
ef50: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
ef60: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
ef70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ef80: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
ef90: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
efa0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
efb0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
efc0: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
efd0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
efe0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
eff0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
f000: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
f010: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
f020: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
f030: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
f040: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
f070: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
f080: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
f090: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
f0a0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
f0b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
f0c0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
f0d0: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
f0e0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
f0f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f100: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
f110: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
f120: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
f130: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f140: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
f150: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
f160: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f170: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f180: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
f190: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
f1a0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f1b0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
f1c0: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
f1d0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
f1e0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
f1f0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
f200: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f210: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
f220: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
f230: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f240: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f250: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f260: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
f270: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
f280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f290: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
f2a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f2b0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
f2c0: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
f2d0: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
f2e0: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
f2f0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
f300: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
f310: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
f320: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
f330: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
f340: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
f350: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
f360: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
f370: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
f380: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
f390: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f3b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f3c0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
f3d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
f3f0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f400: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
f410: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
f420: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
f430: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
f440: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
f450: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
f460: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f470: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
f480: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
f490: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
f4a0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f4b0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f4c0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
f4d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
f4e0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
f4f0: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
f500: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f510: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
f520: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f530: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f540: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
f550: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f560: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
f570: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
f580: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
f590: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f5a0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
f5b0: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
f5c0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
f5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f5e0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
f5f0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
f600: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
f610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
f620: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
f630: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
f640: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f650: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
f660: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
f670: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
f680: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f690: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
f6a0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f6b0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f6c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
f6d0: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f6e0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
f6f0: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
f700: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
f710: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
f720: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
f730: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
f740: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
f750: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
f760: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
f770: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
f780: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
f790: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
f7a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f7b0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
f7c0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
f7d0: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
f7e0: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
f7f0: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
f800: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
f810: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
f820: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
f830: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f840: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f850: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f860: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f870: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f880: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f890: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f8a0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f8b0: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f8c0: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f8d0: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f8e0: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
f8f0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f900: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
f910: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
f920: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
f930: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
f940: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
f950: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
f960: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
f970: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
f980: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
f990: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
f9a0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
f9b0: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
f9c0: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
f9d0: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
f9e0: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
f9f0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
fa00: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
fa10: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
fa20: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
fa30: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
fa40: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
fa50: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
fa60: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
fa70: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
fa80: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
fa90: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
faa0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
fab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fac0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
fad0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
fae0: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
faf0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fb00: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
fb10: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
fb20: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
fb30: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
fb40: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
fb50: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
fb80: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
fb90: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fbc0: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
fbd0: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
fbe0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
fbf0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
fc00: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
fc10: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
fc20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
fc30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
fc40: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
fc50: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
fc60: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
fc70: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
fc80: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
fc90: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
fca0: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
fcb0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
fcc0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
fcd0: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
fce0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fcf0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
fd00: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
fd10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fd20: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
fd30: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
fd40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fd50: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
fd60: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
fd70: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
fd80: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
fd90: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
fda0: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
fdb0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
fdc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
fdd0: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
fde0: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
fdf0: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
fe00: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
fe10: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
fe20: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
fe30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
fe40: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
fe50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
fe60: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
fe70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe80: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
fe90: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
fea0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
feb0: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
fec0: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
fed0: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
fee0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
fef0: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
ff00: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
ff10: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
ff20: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
ff30: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
ff40: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
ff50: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
ff60: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
ff70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
ff80: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
ff90: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
ffa0: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
ffb0: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
ffc0: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
ffd0: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
ffe0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
fff0: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
10000 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
10010 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
10020 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
10030 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
10040 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
10050 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
10060 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
10070 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
10080 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
10090 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
100a0 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
100b0 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
100c0 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
100d0 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
100e0 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
100f0 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
10100 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
10110 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
10120 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
10130 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10140 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
10150 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
10160 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
10170 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
10180 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
10190 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
101a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
101b0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
101c0 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
101d0 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
101e0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
101f0 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
10200 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
10210 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
10220 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
10230 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
10240 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
10250 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
10260 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
10270 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
10280 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
10290 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
102a0 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
102b0 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
102c0 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
102d0 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
102e0 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
102f0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
10300 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
10310 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
10320 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
10330 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
10340 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
10350 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
10360 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
10370 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
10380 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
10390 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
103a0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
103b0 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
103c0 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
103d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
103e0 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
103f0 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
10400 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
10410 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
10420 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
10430 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
10440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
10450 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
10460 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
10470 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
10480 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
10490 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
104a0 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
104b0 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
104c0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
104d0 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
104e0 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
104f0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10500 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
10510 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
10520 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
10530 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
10540 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
10550 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
10560 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
10570 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
10580 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
10590 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
105a0 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
105b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
105c0 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
105d0 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
105e0 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
105f0 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
10600 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10610 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
10620 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
10630 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10640 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
10650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10660 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
10670 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
10680 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
10690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
106a0 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
106b0 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
106c0 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
106d0 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
106e0 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
106f0 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
10700 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
10710 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
10720 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
10730 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
10740 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10750 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
10760 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
10770 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
10780 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
10790 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
107a0 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
107b0 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
107c0 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
107d0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
107e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
107f0 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
10800 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
10810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10820 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
10830 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
10840 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
10850 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
10860 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
10870 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
10880 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
10890 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
108a0 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
108b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
108c0 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
108d0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
108e0 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
108f0 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
10900 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
10910 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
10920 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
10930 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
10940 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
10950 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
10960 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
10970 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
10980 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
10990 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
109a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
109b0 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
109c0 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
109d0 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
109e0 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
109f0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
10a00 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
10a10 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
10a20 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
10a30 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
10a40 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
10a50 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
10a60 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
10a70 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
10a80 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
10a90 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
10aa0 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
10ab0 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
10ac0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
10ad0 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
10ae0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
10af0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
10b00 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
10b30 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
10b40 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
10b50 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
10b60 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
10b70 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
10b80 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10b90 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
10ba0 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
10bb0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
10bc0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10bd0 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
10be0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
10bf0 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
10c00 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
10c10 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
10c20 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
10c30 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
10c40 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
10c50 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10c60 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
10c70 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
10c80 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10c90 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10ca0 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
10cb0 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10cc0 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
10cd0 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
10ce0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
10cf0 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
10d00 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10d10 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
10d20 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
10d30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10d40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10d50 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
10d60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10d70 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
10d80 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
10d90 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
10da0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
10db0 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
10dc0 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
10dd0 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
10de0 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
10df0 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
10e00 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
10e10 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
10e20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
10e30 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
10e40 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
10e50 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
10e60 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
10e70 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
10e80 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
10e90 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
10ea0 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
10eb0 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
10ec0 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
10ed0 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
10ee0 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
10ef0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
10f00 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
10f10 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
10f20 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
10f30 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10f40 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
10f50 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
10f60 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
10f70 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
10f80 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
10f90 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10fa0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
10fb0 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10fc0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
10fd0 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
10fe0 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
10ff0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
11000 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
11010 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20  TE_Stat3).  ){. 
11020 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
11030 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
11040 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
11050 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
11060 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
11070 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
11080 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
11090 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
110a0 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
110d0 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
110e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11100 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
11110 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  e, TK_NULL, 0, 0
11120 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69  , 0), 0);..    i
11130 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
11140 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
11150 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
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 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
11180 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
11190 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
111a0 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a    if( idxNew ){.
111b0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
111c0 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
111d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
111e0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
111f0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  0;.      pNewTer
11200 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
11210 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
11220 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
11230 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
11240 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
11250 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
11260 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
11270 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
11280 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
11290 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  rm;.      pTerm 
112a0 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
112b0 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
112c0 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
112d0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
112e0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
112f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11300 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
11310 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
11320 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11330 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11340 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20  E_STAT */..  /* 
11350 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73  Prevent ON claus
11360 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46  e terms of a LEF
11370 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e  T JOIN from bein
11380 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a  g used to drive.
11390 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f    ** an index fo
113a0 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
113b0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
113c0 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e  ..  */.  pTerm->
113d0 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65  prereqRight |= e
113e0 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a  xtraRight;.}../*
113f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11400 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
11410 20 66 6f 72 20 61 20 65 6e 74 72 79 20 74 68 61   for a entry tha
11420 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
11430 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
11440 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
11450 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
11460 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
11470 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
11480 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
11490 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
114a0 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
114b0 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
114c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
114d0 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
114e0 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
114f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11500 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
11510 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
11520 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
11530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11540 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
11550 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
11560 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11580 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
11590 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
115a0 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
115b0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
115c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
115d0 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
115e0 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
115f0 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11610 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
11620 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
11630 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
11640 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
11650 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
11660 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
11670 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
11680 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
11690 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
116a0 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
116b0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
116c0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
116d0 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
116e0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
116f0 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
11700 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
11710 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
11720 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
11730 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11740 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11750 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
11760 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41  pr);.      if( A
11770 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20  LWAYS(pColl) && 
11780 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
11790 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
117a0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
117b0 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
117c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
117d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
117e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
117f0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
11800 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
11810 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
11820 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
11830 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a   is redundant..*
11840 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20  *.** A DISTINCT 
11850 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
11860 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
11870 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  e contains some 
11880 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c  subset of.** col
11890 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e  umns that are un
118a0 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c  ique and non-nul
118b0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
118c0 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
118d0 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
118e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
118f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11900 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
11910 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
11920 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
11930 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
11940 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
11950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
11960 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
11970 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
11980 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
11990 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
119a0 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
119b0 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
119c0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
119d0 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
119e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
119f0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
11a00 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
11a10 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
11a20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
11a30 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
11a40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
11a50 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
11a60 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
11a70 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
11a80 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
11a90 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
11aa0 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
11ab0 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
11ac0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
11ad0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11ae0 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
11af0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
11b00 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
11b10 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
11b20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
11b30 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
11b40 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
11b50 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
11b60 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
11b70 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
11b80 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
11b90 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
11ba0 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
11bb0 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
11bc0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
11bd0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
11be0 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
11bf0 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
11c00 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
11c10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
11c20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11c30 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
11c40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
11c50 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
11c60 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
11c70 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
11c80 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
11c90 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
11ca0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
11cb0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
11cc0 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
11cd0 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
11ce0 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
11cf0 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
11d00 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
11d10 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
11d20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
11d30 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
11d40 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
11d50 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
11d60 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
11d70 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
11d80 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
11d90 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
11da0 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
11db0 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
11dc0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
11dd0 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
11de0 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
11df0 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
11e00 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
11e10 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
11e20 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
11e30 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
11e40 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
11e50 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
11e60 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
11e70 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
11e80 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
11e90 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
11ea0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
11eb0 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
11ec0 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
11ed0 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
11ee0 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
11ef0 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
11f00 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
11f10 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
11f20 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
11f30 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11f40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
11f50 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
11f60 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
11f70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
11f80 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
11f90 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
11fa0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
11fb0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
11fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
11fd0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
11fe0 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
11ff0 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
12000 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
12010 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
12020 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
12030 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
12040 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
12050 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
12060 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
12070 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
12080 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  [i]].notNull==0 
12090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
120a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
120b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
120c0 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
120d0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lumn ){.      /*
120e0 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
120f0 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
12100 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
12110 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
12120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12130 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
12140 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  turn 0;.}../* .*
12150 2a 20 54 68 65 20 28 61 6e 20 61 70 70 72 6f 78  * The (an approx
12160 69 6d 61 74 65 29 20 73 75 6d 20 6f 66 20 74 77  imate) sum of tw
12170 6f 20 57 68 65 72 65 43 6f 73 74 73 2e 20 20 54  o WhereCosts.  T
12180 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  his computation 
12190 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70  is.** not a simp
121a0 6c 65 20 22 2b 22 20 6f 70 65 72 61 74 6f 72 20  le "+" operator 
121b0 62 65 63 61 75 73 65 20 57 68 65 72 65 43 6f 73  because WhereCos
121c0 74 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  t is stored as a
121d0 20 6c 6f 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20   logarithmic.** 
121e0 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74  value..** .*/.st
121f0 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 77  atic WhereCost w
12200 68 65 72 65 43 6f 73 74 41 64 64 28 57 68 65 72  hereCostAdd(Wher
12210 65 43 6f 73 74 20 61 2c 20 57 68 65 72 65 43 6f  eCost a, WhereCo
12220 73 74 20 62 29 7b 0a 20 20 73 74 61 74 69 63 20  st b){.  static 
12230 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
12240 68 61 72 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  har x[] = {.    
12250 20 31 30 2c 20 31 30 2c 20 20 20 20 20 20 20 20   10, 10,        
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20   /* 0,1 */.     
12280 20 39 2c 20 39 2c 20 20 20 20 20 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 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20  /* 2,3 */.      
122b0 38 2c 20 38 2c 20 20 20 20 20 20 20 20 20 20 20  8, 8,           
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122d0 2a 20 34 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37  * 4,5 */.      7
122e0 2c 20 37 2c 20 37 2c 20 20 20 20 20 20 20 20 20  , 7, 7,         
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12300 20 36 2c 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20   6,7,8 */.      
12310 36 2c 20 36 2c 20 36 2c 20 20 20 20 20 20 20 20  6, 6, 6,        
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12330 2a 20 39 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20  * 9,10,11 */.   
12340 20 20 20 35 2c 20 35 2c 20 35 2c 20 20 20 20 20     5, 5, 5,     
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 2f 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20    /* 12-14 */.  
12370 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20      4, 4, 4, 4, 
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20     /* 15-18 */. 
123a0 20 20 20 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c       3, 3, 3, 3,
123b0 20 33 2c 20 33 2c 20 20 20 20 20 20 20 20 20 20   3, 3,          
123c0 20 20 20 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a      /* 19-24 */.
123d0 20 20 20 20 20 20 32 2c 20 32 2c 20 32 2c 20 32        2, 2, 2, 2
123e0 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20 20 20 20  , 2, 2, 2,      
123f0 20 20 20 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f       /* 25-31 */
12400 0a 20 20 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62  .  };.  if( a>=b
12410 20 29 7b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   ){.    if( a>b+
12420 34 39 20 29 20 72 65 74 75 72 6e 20 61 3b 0a 20  49 ) return a;. 
12430 20 20 20 69 66 28 20 61 3e 62 2b 33 31 20 29 20     if( a>b+31 ) 
12440 72 65 74 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20  return a+1;.    
12450 72 65 74 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b  return a+x[a-b];
12460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
12470 28 20 62 3e 61 2b 34 39 20 29 20 72 65 74 75 72  ( b>a+49 ) retur
12480 6e 20 62 3b 0a 20 20 20 20 69 66 28 20 62 3e 61  n b;.    if( b>a
12490 2b 33 31 20 29 20 72 65 74 75 72 6e 20 62 2b 31  +31 ) return b+1
124a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 2b 78  ;.    return b+x
124b0 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  [b-a];.  }.}../*
124c0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69  .** Convert an i
124d0 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 57 68  nteger into a Wh
124e0 65 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68  ereCost.  In oth
124f0 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74  er words, comput
12500 65 20 61 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72  e a.** good appr
12510 6f 78 69 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20  oximatation for 
12520 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73  10*log2(x)..*/.s
12530 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
12540 77 68 65 72 65 43 6f 73 74 28 74 52 6f 77 63 6e  whereCost(tRowcn
12550 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63 20 57  t x){.  static W
12560 68 65 72 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b  hereCost a[] = {
12570 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20   0, 2, 3, 5, 6, 
12580 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65  7, 8, 9 };.  Whe
12590 72 65 43 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20  reCost y = 40;. 
125a0 20 69 66 28 20 78 3c 38 20 29 7b 0a 20 20 20 20   if( x<8 ){.    
125b0 69 66 28 20 78 3c 32 20 29 20 72 65 74 75 72 6e  if( x<2 ) return
125c0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 78   0;.    while( x
125d0 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20  <8 ){  y -= 10; 
125e0 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c  x <<= 1; }.  }el
125f0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 78  se{.    while( x
12600 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b  >255 ){ y += 40;
12610 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20   x >>= 4; }.    
12620 77 68 69 6c 65 28 20 78 3e 31 35 20 29 7b 20 20  while( x>15 ){  
12630 79 20 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31  y += 10; x >>= 1
12640 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
12650 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d 20 31 30   a[x&7] + y - 10
12660 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
12670 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12680 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  TABLE./*.** Conv
12690 65 72 74 20 61 20 64 6f 75 62 6c 65 20 28 61 73  ert a double (as
126a0 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20 78   received from x
126b0 42 65 73 74 49 6e 64 65 78 20 6f 66 20 61 20 76  BestIndex of a v
126c0 69 72 74 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a  irtual table).**
126d0 20 69 6e 74 6f 20 61 20 57 68 65 72 65 43 6f 73   into a WhereCos
126e0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
126f0 64 73 2c 20 63 6f 6d 70 75 74 65 20 61 6e 20 61  ds, compute an a
12700 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72  pproximation for
12710 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a  .** 10*log2(x)..
12720 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12730 6f 73 74 20 77 68 65 72 65 43 6f 73 74 46 72 6f  ost whereCostFro
12740 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 78  mDouble(double x
12750 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20 20 57 68  ){.  u64 a;.  Wh
12760 65 72 65 43 6f 73 74 20 65 3b 0a 20 20 61 73 73  ereCost e;.  ass
12770 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
12780 38 20 26 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d  8 && sizeof(a)==
12790 38 20 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20  8 );.  if( x<=1 
127a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
127b0 28 20 78 3c 3d 32 30 30 30 30 30 30 30 30 30 20  ( x<=2000000000 
127c0 29 20 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f  ) return whereCo
127d0 73 74 28 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a  st((tRowcnt)x);.
127e0 20 20 6d 65 6d 63 70 79 28 26 61 2c 20 26 78 2c    memcpy(&a, &x,
127f0 20 38 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35   8);.  e = (a>>5
12800 32 29 20 2d 20 31 30 32 32 3b 0a 20 20 72 65 74  2) - 1022;.  ret
12810 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64  urn e*10;.}.#end
12820 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12830 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
12840 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  /../*.** Estimat
12850 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
12860 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
12870 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
12880 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
12890 74 20 65 73 74 4c 6f 67 28 57 68 65 72 65 43 6f  t estLog(WhereCo
128a0 73 74 20 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f  st N){.  WhereCo
128b0 73 74 20 78 20 3d 20 77 68 65 72 65 43 6f 73 74  st x = whereCost
128c0 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
128d0 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
128e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
128f0 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
12900 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
12910 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
12920 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
12930 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
12940 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
12950 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
12960 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
12970 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
12980 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
12990 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
129a0 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
129b0 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
129c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
129d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
129e0 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
129f0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
12a00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
12a10 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
12a20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12a30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
12a40 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
12a50 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
12a60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12a70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
12a80 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
12a90 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
12aa0 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
12ab0 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
12ac0 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
12ad0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12ae0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12af0 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
12b00 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12b10 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
12b20 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
12b30 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
12b40 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
12b50 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
12b60 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
12b70 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
12b80 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
12b90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12ba0 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
12bb0 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
12bc0 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
12bd0 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
12be0 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
12bf0 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
12c00 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
12c10 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
12c20 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
12c30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12c40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
12c50 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
12c60 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
12c70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12c80 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
12c90 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
12ca0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
12cb0 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
12cc0 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
12cd0 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12ce0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12cf0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
12d00 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
12d10 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
12d20 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
12d30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12d40 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
12d50 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
12d60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12d70 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
12d80 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
12d90 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12da0 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
12db0 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
12dc0 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
12dd0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
12de0 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
12df0 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
12e00 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
12e10 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  st);.}.#else.#de
12e20 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
12e30 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
12e40 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12e50 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
12e60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12e70 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
12e80 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
12e90 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
12ea0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
12eb0 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
12ec0 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
12ed0 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
12ee0 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
12ef0 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
12f00 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
12f10 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
12f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f30 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
12f40 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
12f50 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
12f60 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
12f70 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
12f80 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
12f90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
12fa0 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
12fb0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
12fc0 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
12fd0 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
12fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
12ff0 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
13000 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
13010 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
13020 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
13030 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
13040 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
13050 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
13060 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
13070 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72  O_EQ)==0 ) retur
13080 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
13090 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
130a0 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
130b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
130c0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
130d0 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
130e0 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
130f0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
13100 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
13110 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
13120 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
13130 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
13140 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
13150 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
13160 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
13170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13180 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
13190 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
131a0 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
131b0 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
131c0 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
131d0 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
131e0 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
131f0 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
13200 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
13210 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
13220 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
13230 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
13240 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
13250 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
13260 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
13270 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13290 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
132a0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
132b0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
132c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
132d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
132e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
132f0 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
13300 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
13310 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
13320 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
13330 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
13340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13350 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
13360 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
13370 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
13380 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
13390 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
133a0 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
133b0 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
133c0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
133d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
133e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
133f0 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
13400 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
13410 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
13420 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
13430 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
13440 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
13450 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
13460 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
13470 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
13480 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
13490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
134a0 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
134b0 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
134c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134e0 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
134f0 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
13500 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
13510 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
13520 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
13530 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
13540 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13550 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
13560 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
13570 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13580 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
13590 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
135a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
135b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
135c0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
135d0 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
135e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
135f0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
13600 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
13610 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
13620 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
13630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13640 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
13650 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
13660 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
13670 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13680 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
13690 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
136a0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
136d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
136e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
136f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13700 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
13710 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
13730 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
13740 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
13750 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
13780 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
13790 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
137a0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
137b0 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
137c0 62 6a 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61  bject */.  Bitma
137d0 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
137e0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
137f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
13800 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
13810 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
13820 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
13830 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
13840 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
13850 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
13860 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
13870 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
13880 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
13890 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47  ssued */..  /* G
138a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
138b0 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
138c0 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
138d0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
138e0 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
138f0 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
13900 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
13910 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
13920 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
13930 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
13940 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
13950 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74  addrInit = sqlit
13960 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
13970 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  e);..  /* Count 
13980 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
13990 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
139a0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
139b0 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
139c0 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
139d0 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
139e0 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75  aints */.  nColu
139f0 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  mn = 0;.  pTable
13a00 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
13a10 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
13a20 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
13a30 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
13a40 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
13a50 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
13a60 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
13a70 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
13a80 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
13a90 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
13aa0 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
13ab0 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
13ac0 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
13ad0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
13ae0 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
13af0 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
13b00 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
13b10 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
13b20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13b30 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
13b40 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13b50 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
13b60 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69    if( !sentWarni
13b70 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
13b80 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
13b90 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
13ba0 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EX,.            
13bb0 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78  "automatic index
13bc0 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61   on %s(%s)", pTa
13bd0 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
13be0 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
13bf0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
13c00 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57  );.        sentW
13c10 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  arning = 1;.    
13c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
13c30 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
13c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
13c50 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13c60 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
13c70 6f 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20  oop, nColumn+1) 
13c80 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
13c90 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
13ca0 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65  nColumn++] = pTe
13cb0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  rm;.        idxC
13cc0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
13cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13ce0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
13cf0 6e 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  n>0 );.  pLoop->
13d00 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c  u.btree.nEq = pL
13d10 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43  oop->nLTerm = nC
13d20 6f 6c 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  olumn;.  pLoop->
13d30 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
13d40 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
13d50 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
13d60 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20  RE_INDEXED.     
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  | WHERE_AUTO_IND
13d90 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  EX;..  /* Count 
13da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
13db0 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
13dc0 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
13dd0 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
13de0 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
13df0 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
13e00 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
13e10 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
13e20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
13e30 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
13e40 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
13e50 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
13e60 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
13e70 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
13e80 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
13e90 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
13ea0 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
13eb0 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
13ec0 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
13ed0 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
13ee0 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
13ef0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
13f00 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
13f10 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
13f20 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
13f30 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
13f40 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
13f50 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
13f60 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
13f70 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
13f80 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  s | MASKBIT(BMS-
13f90 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  1));.  mxBitCol 
13fa0 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  = (pTable->nCol 
13fb0 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d  >= BMS-1) ? BMS-
13fc0 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  1 : pTable->nCol
13fd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
13fe0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
13ff0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
14000 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
14010 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d  MS-2 );.  for(i=
14020 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
14030 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
14040 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
14050 28 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b  (i) ) nColumn++;
14060 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
14070 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
14080 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
14090 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62   nColumn += pTab
140a0 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b  le->nCol - BMS +
140b0 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d   1;.  }.  pLoop-
140c0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
140d0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
140e0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
140f0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
14100 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
14110 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
14120 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65  index */.  nByte
14130 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29   = sizeof(Index)
14140 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f  ;.  nByte += nCo
14150 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29  lumn*sizeof(int)
14160 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  ;     /* Index.a
14170 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79  iColumn */.  nBy
14180 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
14190 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f  zeof(char*);   /
141a0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a  * Index.azColl *
141b0 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f  /.  nByte += nCo
141c0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
141d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
141e0 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70  SortOrder */.  p
141f0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Idx = sqlite3DbM
14200 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
14210 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
14220 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
14230 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  turn;.  pLoop->u
14240 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
14250 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  pIdx;.  pIdx->az
14260 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26  Coll = (char**)&
14270 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d  pIdx[1];.  pIdx-
14280 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
14290 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  *)&pIdx->azColl[
142a0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
142b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
142c0 75 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c  u8*)&pIdx->aiCol
142d0 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  umn[nColumn];.  
142e0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61  pIdx->zName = "a
142f0 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49  uto-index";.  pI
14300 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43  dx->nColumn = nC
14310 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70  olumn;.  pIdx->p
14320 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
14330 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
14340 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
14350 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
14360 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
14370 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
14380 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
14390 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
143a0 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
143b0 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
143c0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
143d0 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
143e0 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
143f0 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
14400 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
14410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14420 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
14430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
14440 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
14450 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
14460 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
14470 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
14480 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
14490 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
144a0 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
144b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
144c0 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
144d0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
144e0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
144f0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
14500 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
14510 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
14520 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
14530 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
14540 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
14550 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
14560 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
14570 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
14580 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
14590 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
145a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
145b0 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
145c0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
145d0 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
145e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
145f0 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
14600 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
14610 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
14620 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
14630 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
14640 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
14650 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
14660 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
14670 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
14680 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
14690 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
146a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
146b0 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
146c0 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
146d0 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
146e0 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
146f0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
14700 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
14710 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
14720 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
14730 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
14740 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
14750 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f  =nColumn );..  /
14760 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
14770 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
14780 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c    pKeyinfo = sql
14790 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
147a0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
147b0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
147c0 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
147d0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
147e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
147f0 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
14800 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14810 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
14820 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43  vel->iIdxCur, nC
14830 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20  olumn+1, 0,.    
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c  (char*)pKeyinfo,
14860 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
14870 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  OFF);.  VdbeComm
14880 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
14890 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
148a0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
148b0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
148c0 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
148d0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
148e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
148f0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
14900 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
14910 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
14920 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14930 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
14940 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
14950 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
14960 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
14970 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
14980 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14990 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
149a0 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
149b0 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
149c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
149d0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
149e0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
149f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14a00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14a10 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
14a20 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
14a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14a40 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
14a50 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
14a60 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
14a70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14a80 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
14a90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14aa0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
14ab0 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
14ac0 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
14ad0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
14ae0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
14af0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14b00 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
14b10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14b20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
14b30 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
14b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14b60 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
14b70 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
14b80 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14b90 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
14ba0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14bb0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14bc0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14bd0 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
14be0 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
14bf0 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
14c00 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
14c20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14c30 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
14c40 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
14c50 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
14c60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14c70 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
14c80 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
14c90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
14ca0 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
14cb0 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
14cc0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
14cd0 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
14ce0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14cf0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
14d00 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14d10 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
14d20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
14d30 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14d40 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14d50 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
14d60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
14d70 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
14d80 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
14d90 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
14da0 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
14db0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
14dc0 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
14dd0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
14de0 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
14df0 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
14e00 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
14e10 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
14e20 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
14e30 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
14e40 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
14e50 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
14e60 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
14e70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
14e80 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
14e90 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
14ea0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
14eb0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14ec0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14ed0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
14ee0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14ef0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14f00 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
14f10 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
14f20 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
14f30 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
14f40 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
14f50 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
14f60 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
14f70 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
14f80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
14f90 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
14fa0 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
14fb0 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
14fc0 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
14fd0 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
14fe0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
14ff0 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
15000 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
15010 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
15020 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
15030 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
15040 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
15050 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
15060 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
15070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15080 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
15090 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
150a0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
150b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
150c0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
150d0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
150e0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
150f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15100 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
15110 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
15120 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15130 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
15140 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15150 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
15160 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
15170 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15180 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
15190 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
151c0 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
151d0 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
151e0 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
15210 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
15220 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
15230 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
15240 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15250 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
15260 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
15270 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15280 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
15290 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
152a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
152b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
152c0 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
152d0 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
152e0 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
152f0 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
15300 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
15310 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
15320 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
15330 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
15340 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
15350 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
15360 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
15370 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
15380 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15390 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
153a0 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
153b0 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
153c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
153d0 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
153e0 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
153f0 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
15400 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
15410 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
15420 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
15430 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
15440 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
15450 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
15460 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
15470 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
15480 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
15490 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
154a0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
154b0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
154c0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
154d0 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
154e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
154f0 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
15500 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
15510 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
15520 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15530 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
15540 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
15550 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15560 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
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 70 55 73 61 67 65 3b 0a          pUsage;.
155b0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
155c0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
155d0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
155e0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
155f0 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
15600 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
15610 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
15620 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
15630 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
15640 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
15650 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
15660 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
15670 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
15680 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
15690 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
156a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
156b0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
156c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
156d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
156e0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
156f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
15700 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
15710 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
15720 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15730 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
15740 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
15750 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
15760 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
15770 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
15780 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15790 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
157a0 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
157b0 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
157c0 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
157d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
157e0 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
157f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
15800 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
15810 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
15820 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
15830 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15840 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
15850 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
15860 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
15870 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
15880 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
15890 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
158a0 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
158b0 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
158c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
158d0 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
158e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
158f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15900 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
15910 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
15920 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15930 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
15940 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
15950 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15960 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
15970 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15980 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
15990 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
159a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
159b0 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
159c0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
159d0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
159e0 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
159f0 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
15a00 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
15a10 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
15a20 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
15a30 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
15a40 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
15a50 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
15a60 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
15a70 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
15a80 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
15a90 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
15aa0 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
15ab0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
15ac0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
15ad0 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
15ae0 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
15af0 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
15b00 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
15b10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15b20 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
15b30 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
15b40 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
15b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
15b60 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
15b70 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
15b80 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
15b90 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
15ba0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15bb0 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
15bc0 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
15bd0 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
15be0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
15bf0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
15c00 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
15c10 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
15c20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15c30 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
15c40 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
15c50 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15c60 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
15c70 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
15c80 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
15c90 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15ca0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
15cb0 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
15cc0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
15cd0 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
15ce0 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
15cf0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15d00 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
15d10 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15d20 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
15d30 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
15d40 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
15d50 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
15d60 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
15d70 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
15d80 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
15d90 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
15da0 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
15db0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
15dc0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
15dd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
15de0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15df0 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
15e00 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
15e10 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
15e20 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
15e30 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
15e40 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
15e50 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
15e60 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
15e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15e80 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
15e90 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
15ea0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
15eb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15ec0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
15ed0 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
15ee0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
15ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15f00 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
15f10 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
15f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15f40 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
15f50 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
15f60 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
15f70 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
15f80 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
15f90 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
15fa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15fb0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
15fc0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
15fd0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
15fe0 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
15ff0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
16000 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
16010 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16020 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
16030 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
16040 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
16050 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
16060 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
16070 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
16080 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
16090 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
160a0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
160b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
160c0 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
160d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
160e0 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
160f0 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
16100 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
16110 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
16120 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
16130 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
16140 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
16150 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
16160 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
16170 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16180 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
16190 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53  an pVal.**    aS
161a0 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
161b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
161c0 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a  equal to pVal.**
161d0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
161e0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
161f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16200 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
16210 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
16230 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16240 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
16250 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
16260 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
16270 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
16280 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  of */.  sqlite3_
16290 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20  value *pVal,    
162a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
162b0 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
162c0 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
162d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
162e0 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
162f0 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
16300 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
16310 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
16320 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
16330 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
16340 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20  */.){.  tRowcnt 
16350 6e 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  n;.  IndexSample
16360 20 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74   *aSample;.  int
16370 20 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74   i, eType;.  int
16380 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36 34   isEq = 0;.  i64
16390 20 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20   v;.  double r, 
163a0 72 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72  rS;..  assert( r
163b0 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75  oundUp==0 || rou
163c0 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73  ndUp==1 );.  ass
163d0 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
163e0 6c 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 56  le>0 );.  if( pV
163f0 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  al==0 ) return S
16400 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e  QLITE_ERROR;.  n
16410 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
16420 74 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20  t[0];.  aSample 
16430 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
16440 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
16450 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
16460 61 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  al);..  if( eTyp
16470 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
16480 52 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c  R ){.    v = sql
16490 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
164a0 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20  (pVal);.    r = 
164b0 28 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72 28  (i64)v;.    for(
164c0 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
164d0 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
164e0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
164f0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
16500 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
16510 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16520 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
16530 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
16540 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16550 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16560 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
16570 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
16580 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a  le[i].u.i>=v ){.
16590 20 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d            isEq =
165a0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d   aSample[i].u.i=
165b0 3d 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =v;.          br
165c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
165d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
165e0 20 20 20 20 61 73 73 65 72 74 28 20 61 53 61 6d      assert( aSam
165f0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16600 4c 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20  LITE_FLOAT );.  
16610 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16620 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20  e[i].u.r>=r ){. 
16630 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20           isEq = 
16640 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d  aSample[i].u.r==
16650 72 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  r;.          bre
16660 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
16680 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
16690 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
166a0 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76     r = sqlite3_v
166b0 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
166c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
166d0 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  i<pIdx->nSample;
166e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
166f0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16700 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
16710 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16720 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16730 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
16740 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  XT ) break;.    
16750 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
16760 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
16770 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
16780 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  rS = aSample[i].
16790 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  u.r;.      }else
167a0 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
167b0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20  Sample[i].u.i;. 
167c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
167d0 20 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20   rS>=r ){.      
167e0 20 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a    isEq = rS==r;.
167f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16810 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
16820 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
16830 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66     i = 0;.    if
16840 28 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79  ( aSample[0].eTy
16850 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
16860 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65  ) isEq = 1;.  }e
16870 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
16880 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   eType==SQLITE_T
16890 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  EXT || eType==SQ
168a0 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  LITE_BLOB );.   
168b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
168c0 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
168d0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
168e0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
168f0 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d  ITE_TEXT || aSam
16900 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16910 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
16920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16940 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
16950 65 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20 20  e ){      .     
16960 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16970 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
16980 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
16990 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
169a0 2a 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  *z;.      if( eT
169b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
169c0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
169d0 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
169e0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
169f0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
16a00 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16a10 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
16a20 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
16a30 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
16a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16a50 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16a60 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
16a70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 54  Parse, SQLITE_UT
16a80 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a  F8, 0, *pIdx->az
16a90 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f  Coll);.        /
16aa0 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  * If the collati
16ab0 6e 67 20 73 65 71 75 65 6e 63 65 20 77 61 73 20  ng sequence was 
16ac0 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 77 65 20  unavailable, we 
16ad0 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c  should have fail
16ae0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ed.        ** lo
16af0 6e 67 20 61 67 6f 20 61 6e 64 20 6e 65 76 65 72  ng ago and never
16b00 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70 6f   reached this po
16b10 69 6e 74 2e 20 20 42 75 74 20 77 65 27 6c 6c 20  int.  But we'll 
16b20 63 68 65 63 6b 20 6a 75 73 74 20 74 6f 0a 20 20  check just to.  
16b30 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f 75 62        ** be doub
16b40 6c 79 20 73 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ly sure. */.    
16b50 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 43      if( NEVER(pC
16b60 6f 6c 6c 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  oll==0) ) return
16b70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16b80 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
16b90 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61  t u8 *)sqlite3Va
16ba0 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43  lueText(pVal, pC
16bb0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20  oll->enc);.     
16bc0 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20     if( !z ){.   
16bd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16be0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
16c00 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c  sert( z && pColl
16c10 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
16c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c30 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75   n = sqlite3Valu
16c40 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f  eBytes(pVal, pCo
16c50 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20  ll->enc);.  .   
16c60 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d     for(; i<pIdx-
16c70 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
16c80 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
16c90 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70         int eSamp
16ca0 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65  letype = aSample
16cb0 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  [i].eType;.     
16cc0 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
16cd0 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69  pe<eType ) conti
16ce0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
16cf0 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54   eSampletype!=eT
16d00 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66  ype ) break;.#if
16d10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16d20 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69  _UTF16.        i
16d30 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53  f( pColl->enc!=S
16d40 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
16d50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d          int nSam
16d60 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ple;.          c
16d70 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73  har *zSample = s
16d80 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a  qlite3Utf8to16(.
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
16da0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53  , pColl->enc, aS
16db0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53  ample[i].u.z, aS
16dc0 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20  ample[i].nByte, 
16dd0 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20  &nSample.       
16de0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
16df0 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a  if( !zSample ){.
16e00 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
16e10 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
16e20 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
16e30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16e40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
16e50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
16e60 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
16e70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61  Coll->pUser, nSa
16e80 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e  mple, zSample, n
16e90 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
16ea0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16eb0 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  , zSample);.    
16ec0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
16ed0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
16ee0 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
16ef0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
16f00 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  r, aSample[i].nB
16f10 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  yte, aSample[i].
16f20 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  u.z, n, z);.    
16f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16f40 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c>=0 ){.      
16f50 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69      if( c==0 ) i
16f60 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sEq = 1;.       
16f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16f80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16f90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
16fa0 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70  his point, aSamp
16fb0 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
16fc0 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  st sample that i
16fd0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  s greater than. 
16fe0 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
16ff0 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d  pVal.  Or if i==
17000 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74  pIdx->nSample, t
17010 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  hen all samples 
17020 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68  are less.  ** th
17030 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61  an pVal.  If aSa
17040 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74  mple[i]==pVal, t
17050 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a  hen isEq==1..  *
17060 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a  /.  if( isEq ){.
17070 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
17080 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
17090 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
170a0 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
170b0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
170c0 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d  mple[i].nEq;.  }
170d0 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
170e0 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
170f0 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
17100 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
17110 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
17120 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
17130 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c  [0].nLt;.    }el
17140 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
17150 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
17160 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c  ple ? n : aSampl
17170 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20  e[i].nLt;.      
17180 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
17190 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d  [i-1].nEq + aSam
171a0 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20  ple[i-1].nLt;.  
171b0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
171c0 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a   = pIdx->avgEq;.
171d0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
171e0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
171f0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
17200 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
17210 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
17220 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
17230 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
17240 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
17250 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
17260 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
17270 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
17280 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
17290 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
172a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
172b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
172c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
172d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
172e0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
172f0 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
17300 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
17310 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
17320 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
17330 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
17340 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
17350 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
17360 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
17370 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
17380 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
17390 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
173a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
173b0 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
173c0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
173d0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
173e0 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
173f0 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
17400 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
17410 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
17420 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
17430 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
17440 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
17450 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
17460 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
17470 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
17480 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
17490 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
174a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
174b0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
174c0 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
174d0 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
174e0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
174f0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
17500 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
17510 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
17520 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
17530 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
17540 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
17550 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17560 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
17570 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
17580 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17590 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
175a0 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
175b0 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
175c0 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
175d0 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
175e0 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
175f0 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
17600 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
17610 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
17620 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
17630 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
17640 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
17650 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
17660 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
17670 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
17680 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
17690 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
176a0 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70  e, iVar);.    *p
176b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
176c0 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
176d0 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
176e0 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
176f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17700 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
17710 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
17720 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
17730 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
17740 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
17750 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
17760 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17770 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
17780 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
17790 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
177a0 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
177b0 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
177c0 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
177d0 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
177e0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
177f0 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
17800 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
17810 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
17820 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
17830 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
17840 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
17850 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
17860 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
17870 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
17880 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
17890 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
178a0 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
178b0 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
178c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
178d0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
178e0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
178f0 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
17900 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
17930 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17940 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
17950 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
17960 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
17970 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
17980 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
17990 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
179a0 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
179b0 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
179c0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
179d0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
179e0 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
179f0 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
17a00 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
17a10 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
17a20 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
17a30 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
17a40 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
17a50 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
17a60 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
17a70 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
17a80 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
17a90 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
17aa0 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
17ab0 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
17ac0 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
17ad0 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
17ae0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17af0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
17b00 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
17b10 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
17b20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
17b30 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
17b40 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
17b50 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
17b60 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
17b70 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
17b80 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
17b90 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
17ba0 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
17bb0 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
17bc0 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
17bd0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
17be0 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
17bf0 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
17c00 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
17c10 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
17c20 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65  er divisor to re
17c30 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
17c40 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61  ed.** search spa
17c50 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61  ce.  A return va
17c60 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74  lue of 1 means t
17c70 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  hat range constr
17c80 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20  aints are.** no 
17c90 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20  help at all.  A 
17ca0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
17cb0 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f  2 means range co
17cc0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
17cd0 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64   expected to red
17ce0 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
17cf0 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41  pace by half.  A
17d00 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a  nd so forth....*
17d10 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
17d20 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
17d30 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at3 ANALYZE data
17d40 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
17d50 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
17d60 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
17d70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
17d80 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73  of 4.  Hence a s
17d90 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
17da0 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74   (x>?).** result
17db0 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  s in a return of
17dc0 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63   4 and a range c
17dd0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41  onstraint (x>? A
17de0 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a  ND x<?) results.
17df0 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ** in a return o
17e00 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 16..*/.static 
17e10 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
17e20 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
17e30 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
17e40 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
17e50 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
17e60 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
17e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17e80 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  The index contai
17e90 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63  ning the range-c
17ea0 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20  ompared column; 
17eb0 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  "x" */.  int nEq
17ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17ed0 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61   index into p->a
17ee0 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e  Col[] of the ran
17ef0 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
17f00 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  mn */.  WhereTer
17f10 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
17f20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
17f30 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
17f40 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
17f50 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
17f60 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
17f70 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
17f80 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
17f90 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
17fa0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43  NULL */.  WhereC
17fb0 6f 73 74 20 2a 70 52 61 6e 67 65 44 69 76 20 2f  ost *pRangeDiv /
17fc0 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65  * OUT: Reduce se
17fd0 61 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68  arch space by th
17fe0 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b  is divisor */.){
17ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18000 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
18010 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18020 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  T3..  if( nEq==0
18030 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26   && p->nSample &
18040 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
18050 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
18060 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
18070 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
18080 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b  alue *pRangeVal;
18090 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  .    tRowcnt iLo
180a0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f  wer = 0;.    tRo
180b0 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d  wcnt iUpper = p-
180c0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
180d0 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
180e0 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e      u8 aff = p->
180f0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
18100 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66  aiColumn[0]].aff
18110 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20  inity;..    if( 
18120 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
18130 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
18140 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
18150 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
18160 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
18170 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
18180 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  , &pRangeVal);. 
18190 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
181a0 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
181b0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
181c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
181d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
181e0 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65        && whereKe
181f0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
18200 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20  , pRangeVal, 0, 
18210 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  a)==SQLITE_OK.  
18220 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
18230 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
18240 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65        if( (pLowe
18250 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
18260 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65  O_GT)!=0 ) iLowe
18270 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
18280 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
18290 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
182a0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
182b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
182c0 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
182d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
182e0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
182f0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
18300 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
18310 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
18320 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
18330 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
18340 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
18350 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
18360 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
18370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18380 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
18390 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
183a0 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
183b0 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 1, a)==SQLITE_
183c0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
183d0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
183e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ];.        if( (
183f0 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18400 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20  r & WO_LE)!=0 ) 
18410 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a  iUpper += a[1];.
18420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18430 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
18440 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d  RangeVal);.    }
18450 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18470 57 68 65 72 65 43 6f 73 74 20 69 42 61 73 65 20  WhereCost iBase 
18480 3d 20 77 68 65 72 65 43 6f 73 74 28 70 2d 3e 61  = whereCost(p->a
18490 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20  iRowEst[0]);.   
184a0 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
184b0 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
184c0 69 42 61 73 65 20 2d 3d 20 77 68 65 72 65 43 6f  iBase -= whereCo
184d0 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
184e0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
184f0 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20     *pRangeDiv = 
18500 69 42 61 73 65 3b 0a 20 20 20 20 20 20 57 48 45  iBase;.      WHE
18510 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 20 28  RETRACE(0x100, (
18520 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69  "range scan regi
18530 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76  ons: %u..%u  div
18540 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18560 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
18570 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e  32)iUpper, *pRan
18580 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72  geDiv));.      r
18590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
185a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
185b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
185c0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
185d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
185e0 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
185f0 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
18600 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
18610 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
18620 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d  ;.  *pRangeDiv =
18630 20 30 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a   0;.  /* TUNING:
18640 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74    Each inequalit
18650 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  y constraint red
18660 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
18670 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20  space 4-fold..  
18680 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65  ** A BETWEEN ope
18690 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65  rator, therefore
186a0 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  , reduces the se
186b0 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f  arch space 16-fo
186c0 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77  ld */.  if( pLow
186d0 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77  er && (pLower->w
186e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
186f0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  ULL)==0 ){.    *
18700 70 52 61 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b  pRangeDiv += 20;
18710 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68    assert( 20==wh
18720 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20  ereCost(4) );.  
18730 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  }.  if( pUpper )
18740 7b 0a 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76  {.    *pRangeDiv
18750 20 2b 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28   += 20;  assert(
18760 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34   20==whereCost(4
18770 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ) );.  }.  retur
18780 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
18790 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
187a0 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
187b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
187c0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
187d0 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
187e0 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
187f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
18800 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
18810 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
18820 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
18830 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
18840 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
18850 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
18860 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
18870 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
18880 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
18890 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
188a0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
188b0 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
188c0 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
188d0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
188e0 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
188f0 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
18900 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
18910 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
18920 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
18930 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
18940 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18950 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
18960 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
18970 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
18980 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
18990 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
189a0 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
189b0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
189c0 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
189d0 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
189e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
189f0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
18a00 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
18a10 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
18a20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
18a30 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
18a40 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
18a50 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
18a60 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
18a70 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
18a80 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
18a90 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
18aa0 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
18ab0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
18ac0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
18ad0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
18ae0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
18af0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
18b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18b10 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
18b20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
18b30 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
18b40 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
18b50 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
18b60 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
18b70 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
18b80 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
18b90 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
18ba0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
18bb0 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
18bc0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
18bd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
18be0 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55  hs = 0;  /* VALU
18bf0 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  E on right-hand 
18c00 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f  side of pTerm */
18c10 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c30 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
18c40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c60 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
18c70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
18c80 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
18c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
18ca0 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
18cb0 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
18cc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18cd0 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
18ce0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
18cf0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
18d00 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
18d10 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
18d20 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46  .    rc = valueF
18d30 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
18d40 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68  pExpr, aff, &pRh
18d50 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
18d60 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
18d70 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
18d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68    }else{.    pRh
18d90 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  s = sqlite3Value
18da0 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  New(pParse->db);
18db0 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d  .  }.  if( pRhs=
18dc0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18dd0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72  TE_NOTFOUND;.  r
18de0 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  c = whereKeyStat
18df0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68  s(pParse, p, pRh
18e00 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20  s, 0, a);.  if( 
18e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18e20 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
18e30 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79  0x100,("equality
18e40 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
18e50 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
18e60 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  );.    *pnRow = 
18e70 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45  a[1];.  }.whereE
18e80 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
18e90 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  el:.  sqlite3Val
18ea0 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20  ueFree(pRhs);.  
18eb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
18ec0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
18ed0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18ee0 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  T3) */..#ifdef S
18ef0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18f00 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
18f10 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18f20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
18f30 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
18f40 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
18f50 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
18f60 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
18f70 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
18f80 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
18f90 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
18fa0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
18fb0 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
18fc0 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
18fd0 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
18fe0 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
18ff0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
19000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
19010 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
19020 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
19030 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
19040 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
19050 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
19060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19070 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
19080 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
19090 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
190a0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
190b0 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
190c0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
190d0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
190e0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
190f0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
19100 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
19110 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
19120 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
19130 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
19140 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
19150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
19160 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
19170 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19180 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
19190 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
191a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
191b0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
191c0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
191d0 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
191e0 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
191f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
19200 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
19210 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
19220 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
19230 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
19240 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
19250 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
19260 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
19270 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
19280 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
19290 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
192a0 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
192b0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
192c0 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20   tRowcnt nEst;  
192d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
192e0 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61  er of rows for a
192f0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a   single term */.
19300 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73    tRowcnt nRowEs
19310 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77  t = 0;    /* New
19320 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
19330 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19340 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19360 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
19370 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
19380 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  ample!=0 );.  fo
19390 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
193a0 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d  E_OK && i<pList-
193b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
193c0 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f    nEst = p->aiRo
193d0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20  wEst[0];.    rc 
193e0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
193f0 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Est(pParse, p, p
19400 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
19410 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
19420 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
19430 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
19440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19450 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
19460 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
19470 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
19480 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
19490 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
194a0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
194b0 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
194c0 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
194d0 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
194e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
194f0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19500 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19510 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  AT3) */../*.** D
19520 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
19530 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19540 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
19550 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
19560 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
19570 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
19580 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
19590 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
195a0 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
195b0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
195c0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
195d0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
195e0 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
195f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
19600 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
19610 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
19620 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
19630 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
19640 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
19650 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
19660 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
19670 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
19680 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
19690 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
196a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
196b0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
196c0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
196d0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
196e0 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
196f0 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
19700 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
19710 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
19720 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
19730 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
19740 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
19750 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
19760 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
19770 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
19780 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
19790 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  isabled..**.** I
197a0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
197b0 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20  : R-24597-58655 
197c0 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e  No tests are don
197d0 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  e for terms that
197e0 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65   are.** complete
197f0 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ly satisfied by 
19800 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44  indices..**.** D
19810 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
19820 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
19830 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
19840 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
19850 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
19860 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
19870 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19880 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
19890 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
198a0 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
198b0 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
198c0 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
198d0 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
198e0 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
198f0 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
19900 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
19910 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
19920 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
19930 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
19940 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
19950 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
19960 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
19970 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
19980 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
19990 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
199a0 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
199b0 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
199c0 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
199d0 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
199e0 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
199f0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
19a00 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
19a10 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
19a20 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
19a30 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
19a40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
19a50 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
19a60 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
19a70 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
19a80 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
19a90 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
19aa0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
19ab0 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
19ac0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
19ad0 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
19ae0 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
19af0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
19b00 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
19b10 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
19b20 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
19b30 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
19b40 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
19b50 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
19b60 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
19b70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
19b80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
19b90 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
19ba0 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
19bb0 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
19bc0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
19bd0 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
19be0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
19bf0 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
19c00 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
19c10 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
19c20 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
19c30 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
19c40 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
19c50 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
19c60 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
19c70 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
19c80 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
19c90 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19ca0 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
19cb0 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
19cc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19cd0 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
19ce0 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
19cf0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
19d00 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
19d10 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
19d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
19d30 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
19d40 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
19d50 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
19d60 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
19d70 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
19d80 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
19d90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19da0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
19db0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19dc0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19dd0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
19de0 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
19df0 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
19e00 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
19e10 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
19e20 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
19e30 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
19e40 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
19e50 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
19e60 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
19e70 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
19e80 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
19e90 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19ea0 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
19eb0 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
19ec0 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
19ed0 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
19ee0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
19ef0 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
19f00 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
19f10 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
19f20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
19f30 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
19f40 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
19f50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19f60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
19f70 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
19f80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19f90 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
19fa0 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
19fb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
19fc0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
19fd0 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
19fe0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
19ff0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1a000 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
1a010 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1a020 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
1a030 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
1a040 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
1a050 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
1a060 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
1a070 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
1a080 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
1a090 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1a0a0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
1a0b0 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
1a0c0 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
1a0d0 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
1a0e0 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
1a0f0 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
1a100 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
1a110 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
1a120 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
1a130 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
1a140 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
1a150 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
1a160 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
1a170 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
1a180 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
1a190 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
1a1a0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
1a1b0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
1a1c0 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
1a1d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1a1e0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1a1f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1a200 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1a210 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
1a220 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a230 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
1a240 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1a250 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
1a260 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
1a270 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
1a280 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
1a290 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
1a2a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1a2b0 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1a2c0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
1a2d0 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a2f0 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
1a300 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
1a310 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
1a320 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
1a330 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
1a340 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
1a350 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1a360 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
1a370 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
1a380 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a390 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1a3c0 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
1a3d0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
1a3e0 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
1a3f0 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
1a400 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1a410 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1a420 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1a430 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1a440 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
1a450 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
1a460 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
1a470 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
1a480 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a490 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
1a4a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a4b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
1a4c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
1a4d0 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
1a4e0 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
1a4f0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
1a500 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
1a510 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1a520 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
1a530 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1a540 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1a550 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
1a560 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a570 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
1a580 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1a590 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1a5a0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
1a5b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
1a5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1a5d0 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
1a5e0 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
1a5f0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
1a600 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
1a610 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
1a620 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
1a630 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
1a640 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
1a650 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   pX, 0);.    if(
1a660 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a670 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
1a680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
1a690 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
1a6a0 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
1a6b0 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
1a6c0 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
1a6d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a6e0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
1a6f0 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
1a700 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  b, 0);.    asser
1a710 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
1a720 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1a730 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
1a740 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
1a750 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
1a760 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1a770 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
1a780 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
1a790 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1a7a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a7b0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1a7c0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
1a7d0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
1a7e0 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
1a7f0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1a800 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
1a810 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
1a820 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
1a850 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
1a860 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
1a870 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
1a880 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
1a890 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
1a8a0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
1a8b0 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
1a8c0 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
1a8d0 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
1a8e0 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
1a8f0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
1a900 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
1a910 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1a920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a930 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1a940 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
1a950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a960 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
1a970 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a980 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1a990 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
1a9a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a9b0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
1a9c0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1a9d0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1a9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a9f0 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
1aa00 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
1aa10 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
1aa20 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
1aa30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1aa40 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
1aa50 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
1aa60 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
1aa70 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1aa80 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1aa90 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
1aaa0 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
1aab0 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
1aac0 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  x..**.** For exa
1aad0 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
1aae0 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
1aaf0 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
1ab00 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
1ab10 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
1ab20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
1ab30 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
1ab40 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
1ab50 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
1ab60 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
1ab70 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
1ab80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1ab90 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
1aba0 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
1abb0 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
1abc0 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
1abd0 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
1abe0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1abf0 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
1ac00 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
1ac10 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1ac20 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
1ac30 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
1ac40 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
1ac50 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
1ac60 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69  l be stored.** i
1ac70 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  n consecutive re
1ac80 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
1ac90 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
1aca0 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72  st register is r
1acb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1acc0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
1acd0 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74  ove nEq==2.  But
1ace0 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
1acf0 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76   works for any v
1ad00 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69  alue.** of nEq i
1ad10 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20  ncluding 0.  If 
1ad20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75  nEq==0, this rou
1ad30 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61  tine is nearly a
1ad40 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f   no-op..** The o
1ad50 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65  nly thing it doe
1ad60 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68  s is allocate th
1ad70 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d  e pLevel->iMem m
1ad80 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a  emory cell and.*
1ad90 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66  * compute the af
1ada0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a  finity string..*
1adb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1adc0 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  e always allocat
1add0 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  es at least one 
1ade0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1adf0 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
1ae00 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d  ndex of that mem
1ae10 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f  ory cell. The co
1ae20 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
1ae30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1ae40 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f  ll use that memo
1ae50 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65  ry cell to store
1ae60 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
1ae70 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
1ae80 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
1ae90 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
1aea0 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
1aeb0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1aec0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
1aed0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
1aee0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1aef0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
1af00 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
1af10 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
1af20 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
1af30 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
1af40 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
1af50 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
1af60 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1af70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
1af80 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
1af90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1afa0 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
1afb0 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
1afc0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
1afd0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
1afe0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1aff0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
1b000 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
1b010 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
1b020 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
1b030 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
1b040 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
1b050 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1b060 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1b070 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
1b080 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
1b090 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1b0a0 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
1b0b0 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
1b0c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
1b0d0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
1b0e0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
1b0f0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
1b100 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
1b110 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
1b120 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
1b130 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
1b140 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
1b150 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
1b160 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
1b170 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
1b180 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
1b190 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
1b1a0 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
1b1b0 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
1b1c0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
1b1d0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
1b1e0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
1b1f0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
1b200 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
1b210 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
1b220 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
1b230 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
1b240 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1b250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1b260 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1b270 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1b280 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1b290 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
1b2a0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
1b2b0 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
1b2c0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
1b2d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b2e0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
1b2f0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
1b300 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
1b310 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
1b320 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1b330 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1b340 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1b350 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
1b360 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
1b370 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
1b380 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
1b390 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1b3c0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
1b3d0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
1b3e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1b3f0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
1b400 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
1b410 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1b420 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
1b450 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
1b460 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
1b470 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1b480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1b490 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
1b4a0 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
1b4b0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1b4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b4d0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1b4e0 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1b510 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1b520 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
1b530 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1b540 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1b550 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
1b560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b570 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
1b580 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
1b590 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
1b5c0 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
1b5d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
1b5e0 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
1b5f0 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
1b600 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
1b610 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
1b620 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1b630 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
1b640 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b650 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1b660 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
1b670 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1b680 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  q;.  pIdx = pLoo
1b690 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1b6a0 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  x;.  assert( pId
1b6b0 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  x!=0 );..  /* Fi
1b6c0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1b6d0 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
1b6e0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
1b6f0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
1b700 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
1b710 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
1b720 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f  1;.  nReg = pLoo
1b730 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b  p->u.btree.nEq +
1b740 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
1b750 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1b760 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
1b770 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
1b780 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
1b790 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
1b7a0 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
1b7b0 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
1b7c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1b7d0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1b7e0 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
1b7f0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1b800 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
1b810 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
1b820 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20  Column>=nEq );. 
1b830 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
1b840 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
1b850 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  1;.    pTerm = p
1b860 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
1b870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1b880 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  rm!=0 );.    /* 
1b890 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72  The following tr
1b8a0 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
1b8b0 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
1b8c0 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
1b8d0 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
1b8e0 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
1b8f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b900 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
1b910 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
1b920 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
1b930 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1b940 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
1b950 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1b960 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1b970 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
1b980 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
1b990 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
1b9a0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1b9b0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1b9c0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
1b9d0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
1b9e0 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
1b9f0 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
1ba00 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1ba10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1ba20 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
1ba30 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
1ba40 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
1ba50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ba60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
1ba80 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
1ba90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1baa0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1bab0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1bac0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
1bad0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1bae0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1baf0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
1bb00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1bb10 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
1bb20 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
1bb30 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1bb40 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1bb50 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1bb60 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1bb70 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1bb80 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
1bb90 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1bba0 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1bbb0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1bbc0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1bbd0 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1bbe0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1bbf0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1bc00 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1bc10 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1bc20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1bc30 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1bc40 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1bc50 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1bc60 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1bc70 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1bc80 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1bc90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bca0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1bcb0 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1bcc0 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1bcd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bce0 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1bcf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1bd00 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1bd10 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1bd20 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1bd30 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1bd40 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1bd50 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1bd60 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1bd70 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1bd80 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1bd90 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1bda0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1bdb0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1bdc0 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1bdd0 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1bde0 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1bdf0 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1be00 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1be10 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1be20 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1be30 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1be40 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1be50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1be60 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1be70 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1be80 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bea0 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1beb0 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1bec0 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1bed0 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1bee0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bef0 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1bf00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bf20 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1bf30 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1bf40 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1bf50 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1bf60 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1bf70 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bf80 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1bf90 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73  Column, -1);.  s
1bfa0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1bfb0 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
1bfc0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1bfd0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1bfe0 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "?", 1);.}../*
1bff0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
1c000 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
1c010 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
1c020 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
1c030 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1c040 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
1c050 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
1c060 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  g buffer contain
1c070 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f  ing a descriptio
1c080 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73  n.** of the subs
1c090 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  et of table rows
1c0a0 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20   scanned by the 
1c0b0 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20  strategy in the 
1c0c0 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51  form of an.** SQ
1c0d0 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72  L expression. Or
1c0e0 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  , if all rows ar
1c0f0 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20  e scanned, NULL 
1c100 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1c110 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1c120 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1c130 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1c140 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1c150 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1c160 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1c170 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1c180 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1c190 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1c1a0 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1c1b0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1c1c0 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1c1d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1c1e0 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ned pointer poin
1c1f0 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
1c200 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1c210 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  e3DbMalloc()..**
1c220 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1c230 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1c240 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
1c250 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20  the buffer when 
1c260 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  it is.** no long
1c270 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
1c280 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
1c290 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73  lainIndexRange(s
1c2a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
1c2b0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61  eLoop *pLoop, Ta
1c2c0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
1c2d0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c  dex *pIndex = pL
1c2e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1c2f0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
1c300 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c310 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nEq;.  int i, j;
1c320 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  .  Column *aCol 
1c330 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
1c340 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20  int *aiColumn = 
1c350 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1c360 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74  ;.  StrAccum txt
1c370 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  ;..  if( nEq==0 
1c380 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1c390 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
1c3a0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1c3b0 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20  LIMIT))==0 ){.  
1c3c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1c3d0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1c3e0 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30  mInit(&txt, 0, 0
1c3f0 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
1c400 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d  GTH);.  txt.db =
1c410 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   db;.  sqlite3St
1c420 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1c430 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  t, " (", 2);.  f
1c440 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1c450 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ++){.    explain
1c460 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1c470 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d   i, aCol[aiColum
1c480 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22  n[i]].zName, "="
1c490 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b  );.  }..  j = i;
1c4a0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
1c4b0 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  Flags&WHERE_BTM_
1c4c0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
1c4d0 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
1c4e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22  x->nColumn ) ? "
1c4f0 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
1c500 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
1c510 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
1c520 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
1c530 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  +, z, ">");.  }.
1c540 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1c550 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
1c560 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
1c570 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
1c580 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72  ->nColumn ) ? "r
1c590 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
1c5a0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
1c5b0 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
1c5c0 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
1c5d0 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  z, "<");.  }.  s
1c5e0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1c5f0 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20  pend(&txt, ")", 
1c600 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1);.  return sql
1c610 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
1c620 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sh(&txt);.}../*.
1c630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c640 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1c650 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
1c660 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
1c670 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
1c680 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
1c690 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d   query being com
1c6a0 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c  piled is an EXPL
1c6b0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20  AIN QUERY PLAN, 
1c6c0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f  a single.** reco
1c6d0 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
1c6e0 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
1c6f0 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
1c700 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
1c710 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a   .** pLevel..*/.
1c720 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1c730 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
1c740 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c760 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
1c770 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1c780 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
1c790 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
1c7a0 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
1c7b0 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
1c7c0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
1c7e0 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
1c7f0 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
1c800 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
1c810 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1c820 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c830 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
1c840 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
1c850 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
1c880 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
1c890 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
1c8a0 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c8c0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
1c8d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1c8e0 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  () */.){.  if( p
1c8f0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
1c900 32 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  2 ){.    struct 
1c910 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1c920 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1c930 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1c940 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
1c950 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1c960 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
1c970 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
1c980 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1c990 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1c9a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
1c9b0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  ndle */.    char
1c9c0 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20   *zMsg;         
1c9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1c9e0 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20  t to add to EQP 
1c9f0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e  output */.    in
1ca00 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
1ca10 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
1ca20 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
1ca30 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
1ca40 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
1ca50 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
1ca60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ca70 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
1ca80 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
1ca90 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
1caa0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
1cab0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
1cac0 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
1cad0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
1cae0 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cb00 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
1cb10 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
1cb20 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
1cb30 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
1cb40 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e   flags = pLoop->
1cb50 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  wsFlags;.    if(
1cb60 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55   (flags&WHERE_MU
1cb70 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
1cb80 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
1cb90 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65  TABLE_ONLY) ) re
1cba0 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61  turn;..    isSea
1cbb0 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48  rch = (flags&(WH
1cbc0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
1cbd0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
1cbe0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
1cbf0 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f  | ((flags&WHERE_
1cc00 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1cc10 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74   && (pLoop->u.bt
1cc20 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20  ree.nEq>0)).    
1cc30 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
1cc40 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
1cc50 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
1cc60 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
1cc70 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1cc80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1cc90 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
1cca0 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
1ccb0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1ccc0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
1ccd0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cce0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1ccf0 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
1cd00 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
1cd10 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
1cd20 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
1cd30 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1cd40 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1cd50 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
1cd60 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1cd70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1cd80 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
1cd90 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cda0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1cdb0 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
1cdc0 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1cdd0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
1cde0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1cdf0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
1ce00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d  _VIRTUALTABLE))=
1ce10 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59  =0.     && ALWAY
1ce20 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  S(pLoop->u.btree
1ce30 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20  .pIndex!=0).    
1ce40 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1ce50 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49  Where = explainI
1ce60 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c  ndexRange(db, pL
1ce70 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  oop, pItem->pTab
1ce80 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  );.      zMsg = 
1ce90 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1cea0 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  db, zMsg,.      
1ceb0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1cec0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
1ced0 44 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20  DEX) ? .        
1cee0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55             "%s U
1cef0 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25  SING AUTOMATIC %
1cf00 73 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a  sINDEX%.0s%s" :.
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 22 25 73 20 55 53 49 4e 47 20 25 73 49     "%s USING %sI
1cf30 4e 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20  NDEX %s%s"), .  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73               zMs
1cf50 67 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48 45  g, ((flags & WHE
1cf60 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22  RE_IDX_ONLY) ? "
1cf70 43 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29  COVERING " : "")
1cf80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cf90 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1cfa0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
1cfb0 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
1cfc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cfd0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c  zWhere);.    }el
1cfe0 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
1cff0 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26  WHERE_IPK)!=0 &&
1d000 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1d010 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29  CONSTRAINT)!=0 )
1d020 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1d030 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d040 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
1d050 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1d060 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
1d070 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
1d080 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  &(WHERE_COLUMN_E
1d090 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  Q|WHERE_COLUMN_I
1d0a0 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  N) ){.        zM
1d0b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d0c0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d0d0 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a  %s (rowid=?)", z
1d0e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1d0f0 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45  e if( (flags&WHE
1d100 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d  RE_BOTH_LIMIT)==
1d110 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
1d120 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1d130 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d140 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d150 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f   (rowid>? AND ro
1d160 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
1d170 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d180 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f  flags&WHERE_BTM_
1d190 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1d1a0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d1b0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d1c0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22  , "%s (rowid>?)"
1d1d0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1d1e0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
1d1f0 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  flags&WHERE_TOP_
1d200 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20  LIMIT) ){.      
1d210 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d220 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d230 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29  g, "%s (rowid<?)
1d240 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1d250 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
1d260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1d270 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
1d280 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
1d290 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d2a0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  E)!=0 ){.      z
1d2b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d2c0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d2d0 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%s VIRTUAL TABL
1d2e0 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
1d2f0 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
1d300 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1d310 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c  .vtab.idxNum, pL
1d320 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  oop->u.vtab.idxS
1d330 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  tr);.    }.#endi
1d340 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
1d350 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d360 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73   zMsg, "%s", zMs
1d370 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1d380 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d390 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c  Explain, iId, iL
1d3a0 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73  evel, iFrom, zMs
1d3b0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
1d3c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1d3d0 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53  fine explainOneS
1d3e0 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  can(u,v,w,x,y,z)
1d3f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1d400 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
1d410 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  /.../*.** Genera
1d420 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1d430 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
1d440 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
1d450 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
1d460 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1d470 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
1d480 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
1d490 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
1d4a0 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
1d4b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1d4c0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
1d4d0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1d4e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1d4f0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1d500 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
1d510 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
1d520 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
1d530 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
1d540 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
1d550 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
1d560 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
1d570 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
1d580 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
1d590 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d5a0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1d5b0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1d5c0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1d5d0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
1d5e0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
1d5f0 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
1d600 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
1d610 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1d620 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
1d630 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
1d640 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
1d650 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
1d660 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
1d670 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
1d680 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d690 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
1d6a0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1d6b0 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
1d6c0 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
1d6d0 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
1d6e0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1d6f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1d700 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
1d710 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
1d720 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
1d730 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1d740 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1d750 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
1d760 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1d770 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1d780 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1d790 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
1d7a0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1d7b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1d7e0 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1d810 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
1d820 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
1d830 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d840 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1d850 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
1d860 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
1d870 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
1d880 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
1d890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1d8a0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
1d8b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1d8c0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
1d8d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1d8e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1d8f0 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
1d900 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
1d910 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
1d920 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
1d930 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
1d940 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1d950 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
1d960 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
1d970 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
1d980 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
1d990 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
1d9a0 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74  turning */.  Bit
1d9b0 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79  mask newNotReady
1d9c0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
1d9d0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61   value */..  pPa
1d9e0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1d9f0 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1da00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1da10 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1da20 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1da30 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1da40 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1da50 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
1da60 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
1da70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1da80 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
1da90 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1daa0 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d  Cursor;.  bRev =
1dab0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
1dac0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
1dad0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
1dae0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1daf0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
1db00 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1db10 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1db20 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
1db30 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56  E_TABLE)==0;.  V
1db40 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1db50 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20 4c  v, "Begin Join L
1db60 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65 6c 29  oop %d", iLevel)
1db70 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
1db80 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
1db90 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
1dba0 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
1dbb0 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
1dbc0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
1dbd0 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
1dbe0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
1dbf0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
1dc00 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
1dc10 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
1dc20 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
1dc30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
1dc40 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
1dc50 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
1dc60 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
1dc70 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
1dc80 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
1dc90 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
1dca0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
1dcb0 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
1dcc0 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
1dcd0 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
1dce0 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
1dcf0 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1dd00 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
1dd10 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
1dd20 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
1dd30 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
1dd40 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1dd50 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
1dd60 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
1dd70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1dd80 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
1dd90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
1dda0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1ddb0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1ddc0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1ddd0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
1dde0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1ddf0 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
1de00 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
1de10 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
1de20 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
1de30 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
1de40 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
1de50 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
1de60 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
1de70 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
1de80 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
1de90 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
1dea0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
1deb0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
1dec0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
1ded0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1dee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1def0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1df00 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
1df10 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
1df20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
1df30 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
1df40 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
1df50 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
1df60 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  ase of a FROM cl
1df70 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d  ause subquery im
1df80 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
1df90 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  o-routine */.  i
1dfa0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
1dfb0 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
1dfc0 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
1dfd0 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
1dfe0 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
1dff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e000 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74  _Integer, pTabIt
1e010 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d  em->addrFillSub-
1e020 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  1, regYield);.  
1e030 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20    pLevel->p2 =  
1e040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e050 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
1e060 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64  egYield);.    Vd
1e070 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
1e080 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f  ext row of co-ro
1e090 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49  utine %s", pTabI
1e0a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1e0b0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
1e0c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e0d0 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20  If, regYield+1, 
1e0e0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
1e0f0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f  evel->op = OP_Go
1e100 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  to;.  }else..#if
1e110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e120 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1e130 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  if(  (pLoop->wsF
1e140 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1e150 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1e160 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
1e170 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
1e180 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
1e190 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
1e1a0 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a  and VNext.    **
1e1b0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
1e1c0 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
1e1d0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65    */.    int iRe
1e1e0 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65  g;   /* P3 Value
1e1f0 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20   for OP_VFilter 
1e200 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  */.    int addrN
1e210 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74  otFound;.    int
1e220 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1e230 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20  Loop->nLTerm;.. 
1e240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e250 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e260 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
1e270 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1e280 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
1e290 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72  int+2);.    addr
1e2a0 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
1e2b0 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20  l->addrBrk;.    
1e2c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1e2d0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1e2e0 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
1e2f0 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20  = iReg+j+2;.    
1e300 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1e310 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
1e320 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
1e330 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e340 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1e350 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
1e360 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75  .        codeEqu
1e370 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1e380 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1e390 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65   j, bRev, iTarge
1e3a0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  t);.        addr
1e3b0 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
1e3c0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1e3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e3e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e3f0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
1e400 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1e410 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  Target);.      }
1e420 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e430 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e440 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f  OP_Integer, pLoo
1e450 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1e460 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
1e470 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e480 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43  , OP_Integer, nC
1e490 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b  onstraint, iReg+
1e4a0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1e4b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e4c0 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61  VFilter, iCur, a
1e4d0 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65  ddrNotFound, iRe
1e4e0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1e4f0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1e500 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20  u.vtab.idxStr,. 
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
1e530 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34  ab.needFree ? P4
1e540 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
1e550 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ATIC);.    pLoop
1e560 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1e570 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  e = 0;.    for(j
1e580 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1e590 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b  t && j<16; j++){
1e5a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
1e5b0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
1e5c0 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20  sk>>j)&1 ){.    
1e5d0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e5e0 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61  pLevel, pLoop->a
1e5f0 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20  LTerm[j]);.     
1e600 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
1e610 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65  vel->op = OP_VNe
1e620 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
1e630 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
1e640 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
1e650 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1e660 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
1e670 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1e680 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
1e690 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1e6a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e6b0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1e6c0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
1e6d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1e6e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1e6f0 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70  */..  if( (pLoop
1e700 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e710 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20  E_IPK)!=0.   && 
1e720 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e730 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1e740 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1e750 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  EQ))!=0.  ){.   
1e760 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
1e770 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66  can directly ref
1e780 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20  erence a single 
1e790 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  row using an.   
1e7a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
1e7b0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1e7c0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1e7d0 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
1e7e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
1e7f0 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
1e800 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
1e810 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
1e820 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ".    **        
1e830 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
1e840 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e850 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1e860 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69 52 65  Eq==1 );.    iRe
1e870 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
1e880 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1e890 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  rse);.    pTerm 
1e8a0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1e8b0 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
1e8c0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
1e8d0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
1e8e0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
1e8f0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1e900 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
1e910 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1e920 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1e930 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1e940 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1e950 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f    iRowidReg = co
1e960 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1e970 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1e980 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69  evel, 0, bRev, i
1e990 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
1e9a0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1e9b0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1e9c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e9d0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
1e9e0 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
1e9f0 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  drNxt);.    sqli
1ea00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ea10 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
1ea20 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
1ea30 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71  owidReg);.    sq
1ea40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1ea50 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1ea60 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  rse, iRowidReg, 
1ea70 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  1);.    sqlite3E
1ea80 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1ea90 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1eaa0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1eab0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1eac0 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76  "pk"));.    pLev
1ead0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1eae0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
1eaf0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1eb00 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
1eb10 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
1eb20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1eb30 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21  E_COLUMN_RANGE)!
1eb40 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1eb50 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20  ase 3:  We have 
1eb60 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
1eb70 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1eb80 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1eb90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1eba0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
1ebb0 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
1ebc0 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
1ebd0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
1ebe0 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
1ebf0 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
1ec00 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
1ec10 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  =0 );.    j = 0;
1ec20 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45  .    pStart = pE
1ec30 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nd = 0;.    if( 
1ec40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1ec50 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
1ec60 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f   ) pStart = pLoo
1ec70 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1ec80 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1ec90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1eca0 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20  OP_LIMIT ) pEnd 
1ecb0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1ecc0 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  j++];.    assert
1ecd0 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70  ( pStart!=0 || p
1ece0 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  End!=0 );.    if
1ecf0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1ed00 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1ed10 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1ed20 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1ed30 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1ed40 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1ed50 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed70 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1ed80 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1ed90 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1eda0 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1edb0 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1edc0 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1edd0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1ede0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1edf0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1ee00 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1ee10 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1ee20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1ee30 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1ee40 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1ee50 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1ee60 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1ee70 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1ee80 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1ee90 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1eea0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1eeb0 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
1eec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1eed0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1eef0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1ef00 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
1ef10 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1ef20 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
1ef30 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ef40 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1ef50 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1ef60 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1ef70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1ef80 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1ef90 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1efa0 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1efb0 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1efc0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1efd0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1efe0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1eff0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ct. */..      as
1f000 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77  sert( (pStart->w
1f010 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1f020 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1f030 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1f040 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1f050 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
1f060 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
1f070 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20  2 */.      pX = 
1f080 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1f090 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1f0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f0b0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
1f0c0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1f0d0 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
1f0e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1f0f0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f100 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f110 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1f120 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
1f130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f140 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
1f150 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
1f160 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
1f170 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1f180 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1f190 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f1a0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1f1b0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1f1c0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1f1d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1f1e0 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
1f1f0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1f200 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
1f210 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f230 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
1f240 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
1f250 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
1f260 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rk);.    }.    i
1f270 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
1f280 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
1f290 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
1f2a0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1f2b0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1f2c0 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77  assert( (pEnd->w
1f2d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1f2e0 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1f2f0 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1f300 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1f310 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69  r ); /* Transiti
1f320 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1f330 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
1f340 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ( pEnd->wtFlags 
1f350 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1f360 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
1f370 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
1f380 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b  memEndValue = ++
1f390 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1f3a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f3b0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
1f3c0 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61  pRight, memEndVa
1f3d0 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
1f3e0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
1f3f0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
1f400 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1f410 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
1f420 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d  : OP_Ge;.      }
1f430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1f440 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1f450 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20  _Lt : OP_Gt;.   
1f460 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62     }.      disab
1f470 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1f480 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
1f490 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
1f4a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1f4b0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1f4c0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
1f4d0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
1f4e0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1f4f0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1f500 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
1f510 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1f520 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >p5==0 );.    if
1f530 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
1f540 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
1f550 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
1f560 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1f570 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1f580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1f5a0 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1f5b0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1f5c0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1f5d0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1f5e0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1f5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f600 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1f610 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1f620 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1f630 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1f640 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1f650 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1f660 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1f670 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f680 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1f690 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1f6a0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1f6b0 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1f6c0 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1f6d0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1f6e0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1f6f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1f700 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1f710 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1f720 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f730 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1f740 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1f750 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1f760 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1f770 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1f780 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1f790 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1f7a0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1f7b0 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1f7c0 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1f7d0 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1f7e0 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1f7f0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1f800 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1f810 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1f820 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1f830 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1f840 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1f850 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1f860 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1f870 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1f880 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1f890 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1f8a0 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1f8b0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1f8c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f8d0 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1f8e0 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1f8f0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1f900 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1f910 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1f920 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1f930 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1f940 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f950 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1f960 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f970 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1f980 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f990 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1f9a0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1f9b0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1f9c0 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1f9d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f9e0 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1f9f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1fa00 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1fa10 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1fa20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1fa30 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1fa40 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1fa50 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1fa60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fa70 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1fa80 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1fa90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1faa0 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1fab0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1fac0 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1fad0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1fae0 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1faf0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1fb00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fb10 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1fb20 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1fb30 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1fb40 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1fb50 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1fb60 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1fb70 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1fb80 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1fb90 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1fba0 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1fbb0 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1fbc0 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1fbd0 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1fbe0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fbf0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1fc00 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1fc10 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1fc20 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1fc30 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1fc40 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1fc50 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1fc60 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc80 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1fc90 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1fca0 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1fcb0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
1fcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1fcd0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1fce0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1fcf0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1fd00 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
1fd10 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1fd20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fd30 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1fd40 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1fd50 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
1fd60 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1fd70 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fd80 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1fd90 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1fda0 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
1fdb0 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1fdc0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fdd0 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1fde0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1fdf0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fe00 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1fe10 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
1fe20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1fe30 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
1fe40 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
1fe50 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
1fe60 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
1fe70 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
1fe80 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
1fe90 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
1fea0 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1feb0 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
1fec0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
1fed0 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
1fee0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a  u.btree.nEq;  /*
1fef0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
1ff00 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   IN terms */.   
1ff10 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
1ff20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ff30 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1ff40 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43   optimized SELEC
1ff50 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20  T min(x).. */.  
1ff60 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff80 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
1ff90 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
1ffa0 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
1ffb0 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffd0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
1ffe0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1fff0 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
20000 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
20010 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
20020 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
20030 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
20040 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
20050 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
20060 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
20070 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
20080 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
20090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
200a0 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
200b0 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
200c0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
200d0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
200e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
200f0 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
20100 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
20110 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
20120 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
20130 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
20140 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
20150 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
20160 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
20170 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20180 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
20190 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
201a0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
201b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
201c0 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
201d0 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
201e0 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
201f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20200 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
20210 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
20220 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
20230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
20240 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
20250 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
20260 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
20270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20280 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
20290 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
202a0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
202b0 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
202c0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
202d0 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
202e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
202f0 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b    char *zEndAff;
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20310 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
20320 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
20330 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70  traint */..    p
20340 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
20350 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
20360 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
20370 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20  l->iIdxCur;..   
20380 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
20390 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
203a0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
203b0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
203c0 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
203d0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
203e0 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
203f0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
20400 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
20410 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
20420 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
20430 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
20440 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
20450 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
20460 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
20470 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
20480 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
20490 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
204a0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
204b0 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
204c0 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
204d0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
204e0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
204f0 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
20500 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
20510 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
20520 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
20530 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
20540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20550 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
20560 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
20570 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
20580 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  && (pWInfo->bOBS
20590 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  at!=0).     && (
205a0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
205b0 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
205c0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
205d0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  rBy->nExpr==1 );
205e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   */.      /* ass
205f0 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61  ert( pOrderBy->a
20600 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
20610 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
20620 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20  mn[nEq] ); */.  
20630 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
20640 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
20650 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
20660 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
20670 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
20680 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
20690 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
206a0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
206b0 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
206c0 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
206d0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
206e0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
206f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
20700 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
20710 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
20720 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
20730 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
20740 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
20750 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
20760 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
20770 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
20780 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
20790 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
207a0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
207b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
207c0 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
207d0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
207e0 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
207f0 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
20800 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
20810 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
20820 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
20830 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
20840 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
20850 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
20860 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
20870 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
20880 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
20890 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
208a0 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d  );.    zEndAff =
208b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
208c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
208d0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64  artAff);.    add
208e0 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
208f0 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  ddrNxt;..    /* 
20900 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
20910 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
20920 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
20930 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
20940 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
20950 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
20960 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
20970 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
20980 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  e .    ** start 
20990 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70  and end terms (p
209a0 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70  RangeStart and p
209b0 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a  RangeEnd)..    *
209c0 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70  /.    if( (nEq<p
209d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
209e0 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
209f0 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
20a00 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20  LITE_SO_ASC)).  
20a10 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70     || (bRev && p
20a20 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45  Idx->nColumn==nE
20a30 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
20a40 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a  SWAP(WhereTerm *
20a50 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61  , pRangeEnd, pRa
20a60 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  ngeStart);.    }
20a70 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
20a80 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
20a90 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
20aa0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
20ab0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
20ac0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20ad0 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
20ae0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20af0 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
20b00 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
20b10 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
20b20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20b30 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
20b40 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
20b50 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
20b60 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20b70 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
20b80 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
20b90 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
20ba0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
20bb0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
20bc0 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
20bd0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
20be0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20bf0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
20c00 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
20c10 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
20c20 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
20c30 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
20c40 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
20c50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20c60 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
20c70 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
20c80 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
20c90 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
20ca0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
20cb0 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
20cc0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
20cd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20ce0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
20cf0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
20d00 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
20d10 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
20d20 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
20d30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20d40 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
20d50 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
20d60 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
20d70 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
20d80 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
20d90 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
20da0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
20db0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
20dc0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
20dd0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
20de0 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
20df0 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
20e00 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
20e10 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
20e20 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
20e30 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
20e40 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
20e50 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
20e60 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
20e70 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
20e80 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
20e90 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
20ea0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
20eb0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
20ec0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
20ed0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
20ee0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
20ef0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
20f00 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
20f10 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
20f20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
20f30 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
20f40 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
20f50 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
20f60 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
20f70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20f80 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
20f90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
20fa0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
20fb0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
20fc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
20fd0 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
20fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ff0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21000 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
21010 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
21020 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
21030 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
21040 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
21050 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
21060 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
21070 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21080 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a  , nConstraint, z
21090 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
210a0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
210b0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
210c0 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
210d0 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
210e0 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
210f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21100 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
21110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21120 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
21130 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
21140 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
21150 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21160 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
21170 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
21180 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
21190 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
211a0 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
211b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
211c0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
211d0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
211e0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
211f0 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
21200 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
21210 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
21220 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
21230 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
21240 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
21250 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
21260 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
21270 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
21280 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
21290 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
212a0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
212b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
212c0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
212d0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
212e0 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
212f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21300 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
21310 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
21320 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
21330 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21340 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
21350 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21360 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
21370 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
21380 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
21390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
213a0 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
213b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
213c0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
213d0 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  y(pRight, zEndAf
213e0 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
213f0 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
21400 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
21410 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
21420 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
21430 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
21440 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
21450 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
21460 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
21470 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
21480 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
21490 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
214a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
214b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
214c0 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
214d0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
214e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
21500 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
21510 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e  ange(pRight, zEn
21520 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  dAff[nEq]) ){.  
21530 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
21540 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
21550 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
21560 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
21570 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
21580 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
21590 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64  ase, nEq+1, zEnd
215a0 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
215b0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
215c0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
215d0 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
215e0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
215f0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
21600 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1662 */.    }.  
21610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21620 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61  pParse->db, zSta
21630 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
21640 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
21650 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  ->db, zEndAff);.
21660 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
21670 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
21680 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
21690 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
216a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
216b0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
216c0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
216d0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
216e0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
216f0 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28     op = aEndOp[(
21700 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71  pRangeEnd || nEq
21710 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b  ) * (1 + bRev)];
21720 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21730 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20  p==OP_Noop );.  
21740 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21750 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
21760 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21770 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66  _IdxLT );.    if
21780 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ( op!=OP_Noop ){
21790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
217a0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
217b0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
217c0 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
217d0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
217e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
217f0 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d  ngeP5(v, endEq!=
21800 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20  bRev ?1:0);.    
21810 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
21820 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
21830 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63  y constraints, c
21840 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
21850 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  lue.    ** of th
21860 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74  e table column t
21870 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69  hat the inequali
21880 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20  ty contrains is 
21890 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
218a0 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
218b0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
218c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
218d0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31  p..    */.    r1
218e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
218f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
21900 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f    testcase( pLoo
21910 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21920 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a  RE_BTM_LIMIT );.
21930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
21940 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21950 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
21960 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
21970 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
21980 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
21990 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
219a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
219b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
219c0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
219d0 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
219e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
219f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
21a00 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
21a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21a20 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21a30 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
21a40 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
21a50 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
21a60 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
21a70 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
21a80 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
21a90 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
21aa0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
21ab0 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
21ac0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
21ad0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
21ae0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
21af0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21b00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
21b10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21b20 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
21b30 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
21b40 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21b50 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
21b60 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
21b70 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
21b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
21ba0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
21bb0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
21bc0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
21bd0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
21be0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
21bf0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
21c00 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
21c10 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
21c20 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
21c30 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
21c40 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
21c50 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
21c60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
21c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
21c80 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ROW ){.      pLe
21c90 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
21ca0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
21cb0 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
21cc0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
21cd0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
21ce0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21cf0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
21d00 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
21d10 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
21d20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
21d30 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
21d40 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
21d50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
21d60 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
21d70 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
21d80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d90 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
21da0 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
21db0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
21dc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
21dd0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
21de0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
21df0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
21e00 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
21e10 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
21e20 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
21e30 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
21e40 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
21e50 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
21e60 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
21e70 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
21e80 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
21e90 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
21ea0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
21eb0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21ec0 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
21ed0 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
21ee0 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
21ef0 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
21f00 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
21f10 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
21f20 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
21f30 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
21f40 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
21f50 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
21f60 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
21f70 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
21f80 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
21f90 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
21fa0 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
21fb0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
21fc0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
21fd0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
21fe0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
21ff0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
22000 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
22010 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
22020 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
22030 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
22040 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
22050 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
22060 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
22070 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
22080 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
22090 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
220a0 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
220b0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
220c0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
220d0 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
220e0 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
220f0 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
22100 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
22110 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
22120 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
22130 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
22140 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
22150 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
22160 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
22190 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
221a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
221b0 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
221c0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
221d0 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
221e0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
221f0 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
22200 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
22210 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
22220 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
22230 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
22240 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
22250 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
22260 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
22270 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
22280 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
22290 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
222a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
222b0 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
222c0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
222d0 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
222e0 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
222f0 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
22300 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
22310 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
22320 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22340 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
22350 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
22360 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
22370 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
22380 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
22390 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
223a0 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
223b0 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
223c0 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
223d0 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
223e0 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
223f0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
22400 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
22410 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
22420 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
22430 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
22440 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
22450 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
22460 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
22470 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
22480 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22490 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
224a0 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
224b0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
224c0 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
224d0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
224e0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
224f0 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
22500 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
22510 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
22520 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
22530 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
22540 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
22550 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
22560 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
22590 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
225a0 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
225b0 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
225e0 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
225f0 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
22600 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
22610 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
22620 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
22630 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
22640 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
22670 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
22680 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
22690 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
226a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
226b0 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
226c0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
226d0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22700 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22710 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70     Expr *pAndExp
22720 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
22730 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20        /* An ".. 
22740 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65  AND (...)" expre
22750 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20  ssion */.   .   
22760 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
22770 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
22780 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
22790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
227a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
227b0 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
227c0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
227d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
227e0 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
227f0 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
22800 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
22810 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
22820 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
22830 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
22840 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
22850 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
22860 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
22870 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
22880 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
22890 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
228a0 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
228b0 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
228c0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
228d0 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
228e0 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
228f0 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
22900 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
22910 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
22920 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
22930 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
22940 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
22950 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
22960 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
22970 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
22980 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
22990 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
229a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
229b0 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
229c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
229d0 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
229e0 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
229f0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
22a00 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
22a10 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
22a20 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
22a30 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
22a60 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
22a70 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
22a80 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
22a90 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
22aa0 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
22ab0 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
22ac0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
22ad0 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
22ae0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
22af0 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
22b00 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
22b10 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
22b20 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
22b30 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
22b40 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
22b50 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
22b60 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
22b70 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
22b80 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
22b90 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
22ba0 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
22bb0 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
22bc0 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
22bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
22be0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
22bf0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
22c00 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
22c10 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
22c20 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
22c30 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
22c40 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
22c50 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
22c60 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
22c70 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a  y rowset..    **
22c80 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69  .    ** Also ini
22c90 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72  tialize regRetur
22ca0 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  n to contain the
22cb0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
22cc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20  instruction .   
22cd0 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
22ce0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50  following the OP
22cf0 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62  _Return at the b
22d00 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
22d10 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  p. This.    ** i
22d20 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20  s required in a 
22d30 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54  few obscure LEFT
22d40 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72   JOIN cases wher
22d50 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a  e control jumps.
22d60 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20      ** over the 
22d70 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
22d80 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
22d90 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
22da0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  e the .    ** co
22db0 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66  rrect response f
22dc0 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f  or the end-of-lo
22dd0 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f  op code (the OP_
22de0 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20  Return) is to . 
22df0 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75     ** fall throu
22e00 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
22e10 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74  nstruction, just
22e20 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64   as an OP_Next d
22e30 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61  oes if.    ** ca
22e40 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  lled on an unini
22e50 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e  tialized cursor.
22e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22e70 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22e80 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
22e90 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
22ea0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
22eb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22ec0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
22ed0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
22ee0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
22ef0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22f00 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
22f10 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
22f20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
22f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22f40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
22f50 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
22f60 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69   /* If the origi
22f70 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
22f80 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72   is z of the for
22f90 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52  m:  (x1 OR x2 OR
22fa0 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20   ...) AND y.    
22fb0 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72  ** Then for ever
22fc0 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75  y term xN, evalu
22fd0 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78  ate as the subex
22fe0 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44  pression: xN AND
22ff0 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77   z.    ** That w
23000 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74  ay, terms in y t
23010 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64  hat are factored
23020 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e   into the disjun
23030 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
23040 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62  * be picked up b
23050 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  y the recursive 
23060 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
23070 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c  WhereBegin() bel
23080 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
23090 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68  * Actually, each
230a0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
230b0 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22  s converted to "
230c0 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20  xN AND w" where 
230d0 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  w is.    ** the 
230e0 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65  "interesting" te
230f0 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73  rms of z - terms
23100 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72   that did not or
23110 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20  iginate in the. 
23120 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e     ** ON or USIN
23130 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  G clause of a LE
23140 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72  FT JOIN, and ter
23150 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62  ms that are usab
23160 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e  le as .    ** in
23170 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
23180 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    ** This optimi
23190 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79  zation also only
231a0 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20   applies if the 
231b0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
231c0 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73  ) term.    ** is
231d0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
231e0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
231f0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
23200 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65      ** See ticke
23210 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  t http://www.sql
23220 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
23230 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20  /f2369304e4.    
23240 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  */.    if( pWC->
23250 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nTerm>1 ){.     
23260 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
23270 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69    for(iTerm=0; i
23280 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  Term<pWC->nTerm;
23290 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
232a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
232b0 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
232c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
232d0 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( &pWC->a[iTerm]
232e0 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74   == pTerm ) cont
232f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23300 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
23310 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
23320 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65  Join) ) continue
23330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
23340 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
23350 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e  ags & (TERM_ORIN
23360 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  FO) ) continue;.
23370 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
23380 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
23390 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
233a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
233b0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
233c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
233d0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
233e0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
233f0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23400 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
23410 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70  , pAndExpr, pExp
23420 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
23430 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
23440 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  {.        pAndEx
23450 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
23460 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44  r(pParse, TK_AND
23470 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
23480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23490 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
234a0 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
234b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
234c0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
234d0 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
234e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
234f0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
23500 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72  =iCur || (pOrTer
23510 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23520 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
23530 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
23540 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
23550 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
23560 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
23570 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
23580 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
23590 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
235a0 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
235b0 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
235c0 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
235d0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
235e0 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
235f0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
23600 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
23610 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
23620 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
23630 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
23640 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
23650 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
23660 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
23670 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
23680 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
23690 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
236a0 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
236b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
236d0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
236e0 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
236f0 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
23710 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
23720 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
23730 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b  _ONLY, iCovCur);
23740 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23750 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
23760 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
23770 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
23780 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
23790 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
237a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
237b0 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
237c0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
237d0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
237e0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
237f0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
23800 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
23810 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
23820 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
23830 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23840 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
23850 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
23860 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
23870 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23880 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
23890 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
238a0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
238b0 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
238c0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
238d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
238e0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
238f0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
23900 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
23930 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
23940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23950 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
23960 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
23970 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
239a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
239b0 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
239c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
239d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
239e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
239f0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
23a00 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
23a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23a20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
23a30 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
23a40 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
23a50 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
23a60 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
23a70 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
23a80 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
23a90 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
23aa0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23ab0 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
23ac0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
23ad0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
23ae0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
23af0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
23b00 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
23b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23b20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
23b30 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23b40 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
23b50 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
23b60 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
23b70 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
23b80 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
23b90 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
23ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
23bb0 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
23bc0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
23bd0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
23be0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
23bf0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
23c00 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
23c10 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
23c20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
23c30 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
23c40 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
23c50 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
23c60 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
23c70 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
23c80 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
23c90 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
23ca0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23cb0 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
23cc0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
23cd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
23ce0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
23cf0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
23d00 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
23d10 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
23d20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
23d30 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
23d40 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
23d50 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
23d60 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
23d70 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
23d80 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
23d90 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
23da0 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
23db0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
23dc0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
23dd0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
23de0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
23df0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
23e00 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
23e10 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
23e20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23e30 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
23e40 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
23e50 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
23e60 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
23e70 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
23e80 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
23e90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
23ea0 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
23eb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23ec0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
23ed0 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
23ee0 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
23ef0 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
23f00 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
23f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23f20 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
23f30 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
23f40 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
23f50 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
23f60 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23f70 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
23f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23f90 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
23fa0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23fb0 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
23fc0 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
23fd0 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
23fe0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
23ff0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
24000 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
24010 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
24020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24030 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
24040 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
24050 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
24060 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
24070 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
24080 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
24090 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
240a0 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
240b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
240c0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
240d0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
240e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
240f0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
24100 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
24110 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
24120 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
24130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24140 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
24150 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
24160 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
24170 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
24180 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
24190 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
241a0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
241b0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
241c0 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
241d0 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
241e0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
241f0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
24200 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
24210 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
24220 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
24230 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
24240 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
24250 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
24260 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
24270 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
24280 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
24290 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
242a0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
242b0 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
242c0 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
242d0 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
242e0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
242f0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
24300 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
24310 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
24320 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
24330 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
24340 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
24350 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
24360 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
24370 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
24380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24390 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
243a0 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
243b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
243c0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
243d0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
243e0 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52 65 61  .  }.  newNotRea
243f0 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20  dy = notReady & 
24400 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
24410 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
24420 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
24430 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
24440 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
24450 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
24460 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
24470 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
24480 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
24490 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
244a0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
244b0 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33  OF: R-49525-5093
244c0 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e  5 Terms that can
244d0 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64  not be satisfied
244e0 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68   through.  ** th
244f0 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
24500 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68   become tests th
24510 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  at are evaluated
24520 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f   against each ro
24530 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  w of.  ** the re
24540 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62  levant input tab
24550 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
24560 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
24570 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
24580 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
24590 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
245a0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
245b0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
245c0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
245d0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
245e0 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  62 */.    testca
245f0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24600 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
24610 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
24620 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24630 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24640 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24650 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
24660 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
24670 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
24680 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24690 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
246a0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
246b0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
246c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
246d0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
246e0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
246f0 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
24700 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
24710 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24720 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
24730 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
24740 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
24750 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24760 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
24770 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
24780 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24790 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
247a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
247b0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
247c0 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
247d0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
247e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
247f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
24800 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
24810 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
24820 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
24830 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
24840 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
24850 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
24860 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
24870 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
24880 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
24890 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
248a0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
248b0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
248c0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
248d0 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
248e0 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
248f0 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
24900 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
24910 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
24920 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
24930 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
24940 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
24950 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
24960 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
24970 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
24980 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
24990 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
249a0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
249b0 70 72 20 2a 70 45 3b 0a 20 20 20 20 57 68 65 72  pr *pE;.    Wher
249c0 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20  eTerm *pAlt;.   
249d0 20 45 78 70 72 20 73 45 71 3b 0a 20 20 20 20 69   Expr sEq;.    i
249e0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
249f0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
24a00 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
24a10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24a20 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24a30 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f  or!=(WO_EQUIV|WO
24a40 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _EQ) ) continue;
24a50 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24a60 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
24a70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24a80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
24a90 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75  ftJoin ) continu
24aa0 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
24ab0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
24ac0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
24ad0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
24ae0 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
24af0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
24b00 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 65 77  rereqRight & new
24b10 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  NotReady)!=0 );.
24b20 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
24b30 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
24b40 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
24b50 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
24b60 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
24b70 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
24b80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24b90 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
24ba0 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
24bb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24bc0 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
24bd0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
24be0 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
24bf0 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
24c00 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
24c10 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
24c20 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
24c30 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
24c40 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
24c50 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24c60 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
24c70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
24c80 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24c90 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
24ca0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24cb0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
24cc0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
24cd0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
24ce0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24cf0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
24d00 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
24d10 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
24d20 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
24d30 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
24d40 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
24d50 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
24d60 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
24d70 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
24d80 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
24d90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24da0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
24db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24dc0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
24dd0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
24de0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
24df0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
24e00 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
24e10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24e20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
24e30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
24e40 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
24e50 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
24e60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
24e70 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24e80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24e90 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
24ea0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
24eb0 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
24ec0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
24ed0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
24ee0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
24ef0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
24f00 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
24f10 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
24f20 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
24f30 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
24f40 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
24f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
24f60 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
24f70 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
24f80 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24fa0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
24fb0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
24fc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24fd0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
24fe0 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
24ff0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25000 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
25010 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
25020 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
25030 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
25040 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25050 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
25060 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
25070 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
25080 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25090 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
250a0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
250b0 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
250c0 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
250d0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
250e0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
250f0 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70  p *p, SrcList *p
25100 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  TabList){.  int 
25110 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74  nb = 1+(pTabList
25120 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
25130 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25140 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62  em *pItem = pTab
25150 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
25160 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
25170 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
25180 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25190 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
251a0 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
251b0 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
251c0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
251d0 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
251e0 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
251f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
25200 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c  gPrintf(" %12s",
25210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25220 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
25230 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
25240 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
25250 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
25260 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
25270 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
25280 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  {.    if( p->u.b
25290 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20  tree.pIndex ){. 
252a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
252b0 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  *zName = p->u.bt
252c0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
252d0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  e;.      if( zNa
252e0 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20  me==0 ) zName = 
252f0 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28  "ipk";.      if(
25300 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
25310 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
25320 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
25330 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
25340 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
25350 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
25360 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
25370 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
25380 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
25390 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
253a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
253b0 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22  ntf(".%-16s %2d"
253c0 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
253d0 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
253e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
253f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
25400 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  20s","");.    }.
25410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
25420 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
25430 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
25440 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
25450 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
25460 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
25480 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
25490 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
254a0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
254b0 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
254c0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
254d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
254e0 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
254f0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
25500 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
25510 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
25520 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
25530 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  9s", z);.    sql
25540 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
25550 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
25560 50 72 69 6e 74 66 28 22 20 66 20 25 30 34 78 20  Printf(" f %04x 
25570 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67  N %d", p->wsFlag
25580 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20  s, p->nLTerm);. 
25590 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
255a0 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
255b0 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
255c0 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
255d0 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
255e0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
255f0 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
25600 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
25610 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
25620 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
25630 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
25640 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
25650 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
25660 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
25670 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
25680 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
25690 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
256a0 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
256b0 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
256c0 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
256d0 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
256e0 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
256f0 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
25700 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
25710 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
25720 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25730 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
25740 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
25750 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
25760 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
25770 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
25780 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
25790 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
257a0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
257b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
257c0 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
257d0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
257e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
257f0 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
25800 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
25810 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
25820 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
25830 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
25840 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25850 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
25860 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
25870 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
25880 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
25890 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
258a0 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
258b0 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
258c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
258d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
258e0 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
258f0 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
25900 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
25910 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
25920 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
25930 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
25940 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
25950 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
25960 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
25970 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
25980 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
25990 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
259a0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
259b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
259c0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
259d0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
259e0 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
259f0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
25a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
25a10 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
25a20 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
25a30 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
25a40 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
25a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25a60 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
25a70 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25a80 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
25a90 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
25aa0 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
25ab0 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
25ac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
25ad0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
25ae0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
25af0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
25b00 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
25b10 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
25b20 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
25b30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
25b40 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
25b50 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
25b60 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
25b70 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
25b80 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
25b90 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
25ba0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
25bb0 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
25bc0 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
25bd0 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
25be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
25c00 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
25c10 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
25c20 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
25c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25c40 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
25c50 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25c60 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
25c70 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
25c80 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
25c90 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
25ca0 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65  om->nLTerm) ) re
25cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
25cc0 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  M;.  whereLoopCl
25cd0 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f  earUnion(db, pTo
25ce0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c  );.  memcpy(pTo,
25cf0 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
25d00 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
25d10 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
25d20 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
25d30 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
25d40 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
25d50 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
25d60 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
25d70 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
25d80 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
25d90 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
25da0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
25db0 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
25dc0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
25dd0 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
25de0 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
25df0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
25e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
25e20 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
25e30 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
25e40 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
25e50 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
25e60 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
25e70 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
25e80 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
25e90 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
25ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
25eb0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
25ec0 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
25ed0 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
25ee0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
25ef0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
25f00 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
25f10 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68  WInfo) ){.    wh
25f20 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
25f30 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
25f40 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
25f50 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20  >pLoops ){.     
25f60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20   WhereLoop *p = 
25f70 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a  pWInfo->pLoops;.
25f80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c        pWInfo->pL
25f90 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  oops = p->pNextL
25fa0 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65  oop;.      where
25fb0 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70  LoopDelete(db, p
25fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25fd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25fe0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WInfo);.  }.}../
25ff0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
26000 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
26010 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
26020 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
26030 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
26040 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
26050 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
26060 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
26070 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
26080 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
26090 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
260a0 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
260b0 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
260c0 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
260d0 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
260e0 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
260f0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26100 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
26110 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
26120 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
26130 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
26140 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
26150 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
26160 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
26170 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
26180 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
26190 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
261a0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
261b0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
261c0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
261d0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
261e0 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
261f0 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
26200 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
26210 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
26220 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
26230 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
26240 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
26250 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
26260 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
26270 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
26280 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
26290 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
262a0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
262b0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
262c0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
262d0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
262e0 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
262f0 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
26300 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
26310 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65   the.** template
26320 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
26330 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
26340 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
26350 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
26360 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
26370 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
26380 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
26390 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
263a0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
263b0 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
263c0 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
263d0 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
263e0 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
263f0 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
26400 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
26410 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
26420 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
26430 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
26440 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
26450 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54  oop.**    (5)  T
26460 68 65 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73  he template uses
26470 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74   more terms of t
26480 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75  he same index bu
26490 74 20 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f  t has no additio
264a0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  nal.**         d
264b0 65 70 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20  ependencies     
264c0 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20       .*/.static 
264d0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  int whereLoopIns
264e0 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  ert(WhereLoopBui
264f0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
26500 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
26510 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f  late){.  WhereLo
26520 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c  op **ppPrev, *p,
26530 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57   *pNext = 0;.  W
26540 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
26550 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
26560 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
26570 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
26580 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
26590 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
265a0 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
265b0 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
265c0 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
265d0 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
265e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
265f0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
26600 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
26610 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
26620 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
26630 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
26640 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
26650 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
26660 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
26670 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
26680 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
26690 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
266c0 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
266d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
266e0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
266f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
26700 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
26710 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26720 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
26730 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
26740 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
26750 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
26760 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
26770 69 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ist);.    }.#end
26780 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
26790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
267a0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
267b0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
267c0 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65  oop to overwrite
267d0 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73  , or which takes
267e0 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f  .  ** priority o
267f0 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20  ver pTemplate.. 
26800 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76   */.  for(ppPrev
26810 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  =&pWInfo->pLoops
26820 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20  , p=*ppPrev; p; 
26830 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
26840 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
26850 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
26860 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
26870 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
26880 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
26890 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
268a0 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
268b0 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
268c0 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
268d0 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
268e0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
268f0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
26900 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
26910 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
26920 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
26930 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
26940 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
26950 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
26960 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
26970 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
26980 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
26990 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
269a0 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
269b0 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
269c0 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
269d0 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
269e0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
269f0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
26a00 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
26a10 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
26a20 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
26a30 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
26a40 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
26a50 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
26a60 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
26a70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
26a80 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
26a90 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
26aa0 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
26ab0 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
26ac0 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
26ad0 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
26ae0 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
26af0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
26b00 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
26b10 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
26b20 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
26b30 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
26b40 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
26b50 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
26b60 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
26b70 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
26b80 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
26b90 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ;..    if( (p->p
26ba0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
26bb0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70  e->prereq)==p->p
26bc0 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d  rereq.     && p-
26bd0 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
26be0 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20  te->rSetup.     
26bf0 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
26c00 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20  plate->rRun.    
26c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
26c20 20 62 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68   branch taken wh
26c30 65 6e 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72  en p is equal or
26c40 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65   better than pTe
26c50 6d 70 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20  mplate in .     
26c60 20 2a 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64   ** all of (1) d
26c70 65 70 65 6e 64 65 6e 63 65 73 20 28 32 29 20 73  ependences (2) s
26c80 65 74 75 70 2d 63 6f 73 74 2c 20 61 6e 64 20 28  etup-cost, and (
26c90 33 29 20 72 75 6e 2d 63 6f 73 74 2e 20 2a 2f 0a  3) run-cost. */.
26ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
26cb0 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
26cc0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20  te->rSetup );.  
26cd0 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72      if( p->nLTer
26ce0 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54  m<pTemplate->nLT
26cf0 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70  erm.       && (p
26d00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26d10 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
26d20 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
26d30 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
26d40 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
26d50 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62         && p->u.b
26d60 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65  tree.pIndex==pTe
26d70 6d 70 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e  mplate->u.btree.
26d80 70 49 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26  pIndex.       &&
26d90 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d   p->prereq==pTem
26da0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
26db0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
26dc0 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
26dd0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
26de0 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61  p with an simila
26df0 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a  r one that uses.
26e00 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20          ** more 
26e10 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
26e20 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  ex */.        pN
26e30 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
26e40 6f 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  op;.        brea
26e50 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
26e60 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70          /* pTemp
26e70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70  late is not help
26e80 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ful..        ** 
26e90 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63  Return without c
26ea0 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e  hanging or addin
26eb0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
26ec0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
26ed0 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b  LoopInsert_noop;
26ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26ef0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
26f00 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
26f10 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
26f20 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  e->prereq.     &
26f30 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
26f40 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20  late->rRun.     
26f50 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 72 53 65  && ALWAYS(p->rSe
26f60 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
26f70 72 53 65 74 75 70 29 20 2f 2a 20 53 65 65 20 53  rSetup) /* See S
26f80 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61  ETUP-INVARIANT a
26f90 62 6f 76 65 20 2a 2f 0a 20 20 20 20 29 7b 0a 20  bove */.    ){. 
26fa0 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74       /* Overwrit
26fb0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  e an existing Wh
26fc0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62  ereLoop with a b
26fd0 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74  etter one: one t
26fe0 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  hat is.      ** 
26ff0 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66  better at one of
27000 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 65 73   (1) dependences
27010 2c 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74  , (2) setup-cost
27020 2c 20 6f 72 20 28 33 29 20 72 75 6e 2d 63 6f 73  , or (3) run-cos
27030 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 69  t.      ** and i
27040 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e  s no worse in an
27050 79 20 6f 66 20 74 68 6f 73 65 20 63 61 74 65 67  y of those categ
27060 6f 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ories. */.      
27070 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
27080 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Loop;.      brea
27090 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
270a0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
270b0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
270c0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
270d0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
270e0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
270f0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
27100 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
27110 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
27120 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
27130 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
27140 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
27150 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
27160 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
27170 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
27180 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
27190 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
271a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
271b0 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22  ntf("ins-del:  "
271c0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
271d0 6f 70 50 72 69 6e 74 28 70 2c 20 70 57 49 6e 66  opPrint(p, pWInf
271e0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
271f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
27200 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
27210 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68  new:  ");.    wh
27220 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
27230 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e  mplate, pWInfo->
27240 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23  pTabList);.  }.#
27250 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
27260 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
27270 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
27280 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
27290 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  oop));.    if( p
272a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
272b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77  ITE_NOMEM;.    w
272c0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
272d0 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70  .  }.  whereLoop
272e0 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
272f0 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65  plate);.  p->pNe
27300 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a  xtLoop = pNext;.
27310 20 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20    *ppPrev = p;. 
27320 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
27330 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
27340 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
27350 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
27360 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
27370 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  ex;.    if( pInd
27380 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e  ex && pIndex->tn
27390 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  um==0 ){.      p
273a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
273b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
273c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
273d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
273e0 65 72 65 20 69 66 20 74 68 65 20 69 6e 73 65 72  ere if the inser
273f0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  t is a no-op */.
27400 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f  whereLoopInsert_
27410 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54  noop:.#if WHERET
27420 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
27430 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
27440 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
27450 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27460 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20  intf("ins-noop: 
27470 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
27480 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
27490 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
274a0 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
274b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
274c0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  OK;  .}../*.** W
274d0 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
274e0 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
274f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27500 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  q terms of the i
27510 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20  ndex pIndex..** 
27520 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
27530 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   more..**.** If 
27540 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
27550 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
27560 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
27570 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
27580 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
27590 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
275a0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
275b0 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
275c0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
275d0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
275e0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
275f0 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
27600 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27610 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
27620 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
27630 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
27640 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
27650 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
27660 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
27670 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57  x on pSrc */.  W
27680 68 65 72 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20  hereCost nInMul 
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
276a0 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20  * log(Number of 
276b0 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74  iterations due t
276c0 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68  o IN) */.){.  Wh
276d0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
276e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
276f0 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e  fo;  /* WHERE an
27700 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  alyse context */
27710 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27720 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
27730 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e;        /* Par
27740 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
27750 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27760 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
27770 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
27780 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20  nnection malloc 
27790 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
277a0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
277c0 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
277d0 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  op under constru
277e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
277f0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
27800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
27810 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20  WhereTerm under 
27820 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
27830 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20  .  int opMask;  
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72     /* Valid oper
27860 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72  ators for constr
27870 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  aints */.  Where
27880 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20  Scan scan;      
27890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
278a0 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45  erator for WHERE
278b0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
278c0 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71  ask saved_prereq
278d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
278e0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
278f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f   pNew->prereq */
27900 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54  .  u16 saved_nLT
27910 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
27920 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27930 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c  alue of pNew->nL
27940 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61  Term */.  int sa
27950 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20  ved_nEq;        
27960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
27970 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
27980 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27990 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f   */.  u32 saved_
279a0 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
279b0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
279c0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
279d0 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68  >wsFlags */.  Wh
279e0 65 72 65 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f  ereCost saved_nO
279f0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut;           /*
27a00 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
27a10 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f  of pNew->nOut */
27a20 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
27a50 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
27a60 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
27a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27a90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
27aa0 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73  WhereCost nRowEs
27ab0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27ac0 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64  /* Estimated ind
27ad0 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a  ex selectivity *
27ae0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c  /.  WhereCost rL
27af0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
27b00 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
27b10 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
27b20 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
27b30 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d  Top = 0, *pBtm =
27b40 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62   0; /* Top and b
27b50 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73  ottom range cons
27b60 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e  traints */..  pN
27b70 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
27b80 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
27b90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
27ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27bb0 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  M;..  assert( (p
27bc0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27bd0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27be0 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
27bf0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
27c00 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
27c10 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
27c20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
27c30 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27c40 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
27c50 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
27c60 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65  }else if( pProbe
27c70 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53  ->tnum<=0 || (pS
27c80 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
27c90 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
27ca0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
27cb0 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
27cc0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
27cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
27ce0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
27cf0 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47  N|WO_ISNULL|WO_G
27d00 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
27d10 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _LE;.  }.  if( p
27d20 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
27d30 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
27d40 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
27d50 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
27d60 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
27d70 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
27d80 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
27d90 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27da0 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f  Eq < pProbe->nCo
27db0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c  lumn ){.    iCol
27dc0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
27dd0 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  umn[pNew->u.btre
27de0 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77  e.nEq];.    nRow
27df0 45 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28  Est = whereCost(
27e00 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
27e10 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
27e20 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  Eq+1]);.    if( 
27e30 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50  nRowEst==0 && pP
27e40 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  robe->onError==O
27e50 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74  E_None ) nRowEst
27e60 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
27e70 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20     iCol = -1;.  
27e80 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20    nRowEst = 0;. 
27e90 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65   }.  pTerm = whe
27ea0 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
27eb0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
27ec0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
27ed0 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
27ef0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
27f00 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
27f10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
27f20 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
27f30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
27f40 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
27f50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
27f60 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
27f70 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
27f80 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
27f90 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
27fa0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
27fb0 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
27fc0 67 28 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f  g(whereCost(pPro
27fd0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29  be->aiRowEst[0])
27fe0 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  );.  for(; rc==S
27ff0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
28000 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68  m!=0; pTerm = wh
28010 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
28020 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  n)){.    int nIn
28030 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
28040 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
28050 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
28060 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  f ) continue;.#i
28070 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28080 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28  LE_STAT3.    if(
28090 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
280a0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d   & TERM_VNULL)!=
280b0 30 20 26 26 20 70 53 72 63 2d 3e 70 54 61 62 2d  0 && pSrc->pTab-
280c0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
280d0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ull ){.      con
280e0 74 69 6e 75 65 3b 20 2f 2a 20 73 6b 69 70 20 49  tinue; /* skip I
280f0 53 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  S NOT NULL const
28100 72 61 69 6e 74 73 20 6f 6e 20 61 20 4e 4f 54 20  raints on a NOT 
28110 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  NULL column */. 
28120 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
28130 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
28140 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
28150 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
28160 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
28170 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
28180 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
28190 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
281a0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
281b0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
281c0 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
281d0 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
281e0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
281f0 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
28200 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
28210 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
28220 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
28230 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
28240 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
28250 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
28260 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
28270 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
28280 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
28290 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
282a0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
282b0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
282c0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
282d0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
282e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
282f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28300 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
28310 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
28320 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
28330 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
28340 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
28350 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
28360 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
28370 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
28380 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
28390 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
283a0 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b  whereCost(25) );
283b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
283c0 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
283d0 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
283e0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
283f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
28400 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
28410 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
28420 20 20 20 20 20 6e 49 6e 20 3d 20 77 68 65 72 65       nIn = where
28430 43 6f 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c  Cost(pExpr->x.pL
28440 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
28450 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
28460 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20  >rRun += nIn;.  
28470 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28480 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
28490 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
284a0 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e  Est + nInMul + n
284b0 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
284c0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
284d0 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  or & (WO_EQ) ){.
284e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
284f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
28500 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
28510 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  L|WHERE_COLUMN_I
28520 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  N))!=0.         
28530 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d           || nInM
28540 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ul==0 );.      p
28550 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
28560 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
28570 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
28580 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  0  .       || (p
28590 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
285a0 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75  OE_None && nInMu
285b0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  l==0.           
285c0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
285d0 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43  .nEq==pProbe->nC
285e0 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29  olumn-1).      )
285f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28600 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
28610 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
28620 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30  IN)==0 || iCol<0
28630 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
28640 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28650 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
28660 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75   }.      pNew->u
28670 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
28680 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28690 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
286a0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
286b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
286c0 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
286d0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
286e0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
286f0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
28700 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
28710 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a  .nEq++;.      /*
28720 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c   TUNING: IS NULL
28730 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20   selects 2 rows 
28740 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31  */.      nIn = 1
28750 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
28760 77 68 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a  whereCost(2) );.
28770 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28780 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
28790 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d  Mul + nIn;.    }
287a0 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
287b0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
287c0 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
287d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
287e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
287f0 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_GT );.      t
28800 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28810 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
28820 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
28830 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28840 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
28850 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
28860 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
28870 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
28880 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
28890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
288a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
288b0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
288c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
288d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
288e0 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  r & WO_LT );.   
288f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28900 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28910 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
28920 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
28930 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
28940 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
28950 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
28960 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
28970 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
28980 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
28990 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
289c0 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
289d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
289e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
289f0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
28a00 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
28a10 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20  Adjust nOut and 
28a20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72  rRun for STAT3 r
28a30 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ange values */. 
28a40 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 72       WhereCost r
28a50 44 69 76 3b 0a 20 20 20 20 20 20 77 68 65 72 65  Div;.      where
28a60 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
28a70 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 4e 65  rse, pProbe, pNe
28a80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2c 0a  w->u.btree.nEq,.
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 20 20 70 42 74 6d 2c 20 70 54          pBtm, pT
28ab0 6f 70 2c 20 26 72 44 69 76 29 3b 0a 20 20 20 20  op, &rDiv);.    
28ac0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28ad0 61 76 65 64 5f 6e 4f 75 74 3e 72 44 69 76 2b 31  aved_nOut>rDiv+1
28ae0 30 20 3f 20 73 61 76 65 64 5f 6e 4f 75 74 20 2d  0 ? saved_nOut -
28af0 20 72 44 69 76 20 3a 20 31 30 3b 0a 20 20 20 20   rDiv : 10;.    
28b00 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
28b10 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
28b20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72   if( pNew->u.btr
28b30 65 65 2e 6e 45 71 3d 3d 31 20 26 26 20 70 50 72  ee.nEq==1 && pPr
28b40 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 0a 20 20 20  obe->nSample.   
28b50 20 20 26 26 20 20 4f 70 74 69 6d 69 7a 61 74 69    &&  Optimizati
28b60 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
28b70 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b 0a 20  LITE_Stat3) ){. 
28b80 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
28b90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
28ba0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
28bb0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
28bc0 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
28bd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28be0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28bf0 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
28c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
28c10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28c20 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
28c30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28c40 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
28c50 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65  rse, pProbe, pTe
28c60 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
28c70 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
28c80 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
28c90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28ca0 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20  O_IN).          
28cb0 20 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50     &&  !ExprHasP
28cc0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
28cd0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28ce0 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)  ){.        
28cf0 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e  rc = whereInScan
28d00 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
28d10 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  be, pTerm->pExpr
28d20 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
28d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28d50 4f 4b 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  OK ) pNew->nOut 
28d60 3d 20 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74  = whereCost(nOut
28d70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
28d80 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
28d90 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
28da0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
28db0 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
28dc0 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76   /* Each row inv
28dd0 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20  olves a step of 
28de0 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  the index, then 
28df0 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
28e00 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
28e10 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  main table */.  
28e20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28e30 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70    whereCostAdd(p
28e40 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53  New->rRun, rLogS
28e50 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a  ize>27 ? rLogSiz
28e60 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20  e-17 : 10);.    
28e70 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f  }.    /* Step co
28e80 73 74 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70  st for each outp
28e90 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e  ut row */.    pN
28ea0 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65  ew->rRun = where
28eb0 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  CostAdd(pNew->rR
28ec0 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  un, pNew->nOut);
28ed0 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a  .    /* TBD: Adj
28ee0 75 73 74 20 6e 4f 75 74 20 66 6f 72 20 61 64 64  ust nOut for add
28ef0 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69  itional constrai
28f00 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nts */.    rc = 
28f10 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
28f20 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
28f30 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
28f40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28f50 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
28f60 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
28f70 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d  ree.nEq<(pProbe-
28f80 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f  >nColumn + (pPro
28f90 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20  be->zName!=0)). 
28fa0 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
28fb0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
28fc0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
28fd0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
28fe0 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
28ff0 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  }.  pNew->prereq
29000 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b   = saved_prereq;
29010 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
29020 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
29030 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
29040 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
29050 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
29060 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
29070 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
29080 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72  aved_nLTerm;.  r
29090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
290a0 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
290b0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
290c0 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
290d0 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
290e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
290f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
29100 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
29110 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
29120 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
29130 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
29140 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
29150 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
29160 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
29170 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
29180 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
29190 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
291a0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
291b0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
291c0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
291d0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
291e0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
291f0 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
29200 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
29210 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
29220 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69  t *pOB;.  int ii
29230 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e  , jj;..  if( pIn
29240 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
29250 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
29260 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
29270 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
29280 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
29290 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
292a0 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69  ii<pOB->nExpr; i
292b0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
292c0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
292d0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
292e0 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  OB->a[ii].pExpr)
292f0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
29300 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
29310 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
29320 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
29330 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
29340 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
29350 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
29360 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
29370 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
29380 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  mn==pIndex->aiCo
29390 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72  lumn[jj] ) retur
293a0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
293b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
293c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
293d0 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
293e0 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
293f0 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
29400 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
29410 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
29420 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
29430 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
29440 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
29450 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
29460 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
29470 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
29480 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
29490 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
294a0 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
294b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
294c0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
294d0 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
294e0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65  olumn[j];.    te
294f0 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
29500 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
29510 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
29520 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29530 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29550 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
29560 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
29570 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
29580 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
29590 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
295a0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
295b0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
295c0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
295d0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
295e0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
295f0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
29600 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
29610 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
29620 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
29630 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
29640 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
29650 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
29660 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
29670 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
29680 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
29690 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
296a0 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
296b0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
296c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
296d0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
296e0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
296f0 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
29700 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
29710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
29720 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
29730 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
29740 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
29750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
29760 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
29770 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
29780 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e   key */.  tRowcn
29790 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
297a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
297b0 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
297c0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
297d0 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
297e0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
297f0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
29800 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
29810 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
29820 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29830 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
29840 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29850 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
29860 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
29870 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
29880 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
29890 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
298a0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
298b0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
298c0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
298d0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
298e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
298f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29900 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
29910 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
29920 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
29930 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
29960 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72   value */.  Wher
29970 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20  eCost rSize;    
29980 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
29990 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
299a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
299b0 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  eCost rLogSize; 
299c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
299d0 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
299e0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
299f0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 0a 20 20  e table */.  .  
29a00 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
29a10 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
29a20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
29a30 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
29a40 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
29a50 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
29a60 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
29a70 69 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  iTab;.  assert( 
29a80 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
29a90 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
29aa0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
29ab0 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
29ac0 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
29ad0 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
29ae0 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
29af0 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   */.    pProbe =
29b00 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
29b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
29b20 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
29b30 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
29b40 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
29b50 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
29b60 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
29b70 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
29b80 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
29b90 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
29ba0 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
29bb0 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
29bc0 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
29bd0 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
29be0 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
29bf0 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
29c00 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
29c10 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
29c20 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
29c30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29c40 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
29c50 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
29c60 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
29c70 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
29c80 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
29c90 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
29ca0 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
29cb0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
29cc0 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
29cd0 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
29ce0 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
29cf0 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
29d00 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
29d10 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
29d20 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70  tPk[0] = pSrc->p
29d30 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
29d40 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
29d50 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
29d60 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
29d70 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
29d80 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
29d90 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
29da0 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
29db0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
29dc0 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
29dd0 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
29de0 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
29df0 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
29e00 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
29e10 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
29e20 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
29e30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
29e40 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
29e50 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65 43    rSize = whereC
29e60 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ost(pSrc->pTab->
29e70 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67  nRowEst);.  rLog
29e80 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
29e90 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 6f  ize);..  /* Auto
29ea0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
29eb0 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
29ec0 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28  ->pOrSet.   && (
29ed0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
29ee0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
29ef0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
29f00 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e  .   && pSrc->pIn
29f10 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53  dex==0.   && !pS
29f20 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
29f30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
29f40 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21  tIndexed.   && !
29f50 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
29f60 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ed.  ){.    /* G
29f70 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
29f80 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
29f90 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
29fa0 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72   *pWC = pBuilder
29fb0 2d 3e 70 57 43 3b 0a 20 20 20 20 57 68 65 72 65  ->pWC;.    Where
29fc0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
29fd0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
29fe0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
29ff0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
2a000 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2a010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a020 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
2a030 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
2a040 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
2a050 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
2a060 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
2a070 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
2a080 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
2a090 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
2a0a0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2a0b0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
2a0c0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2a0d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2a0e0 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
2a0f0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2a100 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
2a110 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
2a120 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2a130 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66   One-time cost f
2a140 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65  or computing the
2a150 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
2a160 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   is.        ** a
2a170 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e  pproximately 7*N
2a180 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
2a190 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2a1a0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
2a1b0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
2a1c0 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f  eing indexed. */
2a1d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a1e0 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
2a1f0 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20   + rSize + 28;  
2a200 61 73 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72  assert( 28==wher
2a210 65 43 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20  eCost(7) );.    
2a220 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
2a230 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
2a240 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
2a250 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
2a260 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
2a270 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
2a280 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
2a290 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
2a2a0 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
2a2b0 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e       ** of known
2a2c0 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
2a2d0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
2a2e0 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
2a2f0 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
2a300 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
2a310 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
2a320 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
2a330 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
2a340 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a350 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
2a360 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 30 29 20  ==whereCost(20) 
2a370 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a380 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
2a390 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
2a3a0 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
2a3b0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a3c0 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
2a3d0 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
2a3e0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2a3f0 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
2a400 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
2a410 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2a420 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2a430 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
2a440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
2a450 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2a460 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
2a470 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2a480 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
2a490 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
2a4a0 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
2a4b0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2a4c0 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
2a4d0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
2a4e0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2a4f0 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
2a500 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2a510 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2a520 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
2a530 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2a540 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2a550 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
2a560 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
2a570 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
2a580 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
2a590 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
2a5a0 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
2a5b0 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
2a5c0 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
2a5d0 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
2a5e0 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
2a5f0 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
2a600 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2a610 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2a620 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
2a630 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
2a640 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
2a650 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
2a660 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
2a670 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
2a680 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2a690 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
2a6a0 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
2a6b0 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
2a6c0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2a6d0 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
2a6e0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2a6f0 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
2a700 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b  e scan is 3*(N +
2a710 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
2a720 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72   **  +  The extr
2a730 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f  a 3 factor is to
2a740 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75   encourage the u
2a750 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f  se of indexed lo
2a760 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20  okups.      **  
2a770 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61     over full sca
2a780 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65 72 20 63  ns.  A smaller c
2a790 6f 6e 73 74 61 6e 74 20 32 20 69 73 20 75 73 65  onstant 2 is use
2a7a0 64 20 66 6f 72 20 63 6f 76 65 72 69 6e 67 0a 20  d for covering. 
2a7b0 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
2a7c0 78 20 73 63 61 6e 73 20 73 6f 20 74 68 61 74 20  x scans so that 
2a7d0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
2a7e0 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 66 61   scan will be fa
2a7f0 76 6f 72 65 64 20 6f 76 65 72 0a 20 20 20 20 20  vored over.     
2a800 20 2a 2a 20 20 20 20 20 61 20 74 61 62 6c 65 20   **     a table 
2a810 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70  scan. */.      p
2a820 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72  New->rRun = wher
2a830 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72  eCostAdd(rSize,r
2a840 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20  LogSize) + 16;. 
2a850 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2a860 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2a870 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2a880 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2a890 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a8a0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
2a8b0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
2a8c0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
2a8d0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 70 4e 65  robe);.      pNe
2a8e0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
2a8f0 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
2a900 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
2a910 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
2a920 45 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  EXED;..      /* 
2a930 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
2a940 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
2a950 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d   b.       || ( m
2a960 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2a970 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
2a980 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
2a990 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2a9a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2a9b0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2a9c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
2a9d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2a9e0 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
2a9f0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2aa00 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
2aa10 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
2aa20 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
2aa30 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
2aa40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2aa50 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2aa60 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2aa70 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  0;.        if( m
2aa80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2aa90 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
2aaa0 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69   of a covering i
2aab0 6e 64 65 78 20 73 63 61 6e 20 69 73 20 32 2a 28  ndex scan is 2*(
2aac0 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
2aad0 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54          **  +  T
2aae0 68 65 20 65 78 74 72 61 20 32 20 66 61 63 74 6f  he extra 2 facto
2aaf0 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67  r is to encourag
2ab00 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  e the use of ind
2ab10 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20  exed lookups.   
2ab20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76         **     ov
2ab30 65 72 20 69 6e 64 65 78 20 73 63 61 6e 73 2e 20  er index scans. 
2ab40 20 41 20 74 61 62 6c 65 20 73 63 61 6e 20 75 73   A table scan us
2ab50 65 73 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  es a factor of 3
2ab60 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
2ab70 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
2ab80 73 63 61 6e 73 20 61 72 65 20 66 61 76 6f 72 65  scans are favore
2ab90 64 20 6f 76 65 72 20 74 61 62 6c 65 20 73 63 61  d over table sca
2aba0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns..          **
2abb0 20 20 2b 20 20 49 66 20 74 68 69 73 20 63 6f 76    +  If this cov
2abc0 65 72 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68  ering index migh
2abd0 74 20 61 6c 73 6f 20 68 65 6c 70 20 73 61 74 69  t also help sati
2abe0 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
2abf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2ac00 20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74    clause, then t
2ac10 68 65 20 63 6f 73 74 20 69 73 20 66 75 64 67 65  he cost is fudge
2ac20 64 20 64 6f 77 6e 20 73 6c 69 67 68 74 6c 79 20  d down slightly 
2ac30 73 6f 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  so that this.   
2ac40 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2ac50 64 65 78 20 69 73 20 66 61 76 6f 72 65 64 20 61  dex is favored a
2ac60 62 6f 76 65 20 6f 74 68 65 72 20 69 6e 64 69 63  bove other indic
2ac70 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20  es that have no 
2ac80 68 6f 70 65 20 6f 66 0a 20 20 20 20 20 20 20 20  hope of.        
2ac90 20 20 2a 2a 20 20 20 20 20 68 65 6c 70 69 6e 67    **     helping
2aca0 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
2acb0 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  BY. */.         
2acc0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 31 30   pNew->rRun = 10
2acd0 20 2b 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   + whereCostAdd(
2ace0 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20  rSize,rLogSize) 
2acf0 2d 20 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  - b;.        }el
2ad00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2ad10 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a 20  sert( b!=0 ); . 
2ad20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
2ad30 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61 6e  NG: Cost of scan
2ad40 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  ning a non-cover
2ad50 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e 2b  ing index is (N+
2ad60 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20  1)*log2(N).     
2ad70 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 65       ** which we
2ad80 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74   will simplify t
2ad90 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29  o just N*log2(N)
2ada0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e   */.          pN
2adb0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
2adc0 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20   + rLogSize;.   
2add0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2ade0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2adf0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2ae00 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
2ae10 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2ae20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2ae30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2ae40 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
2ae50 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
2ae60 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  e, 0);..    /* I
2ae70 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
2ae80 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2ae90 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
2aea0 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
2aeb0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
2aec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
2aed0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
2aee0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2aef0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
2af00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2af10 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
2af20 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2af30 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
2af40 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
2af50 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
2af60 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2af70 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2af80 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2af90 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
2afa0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
2afb0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2afc0 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
2afd0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2afe0 75 69 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52  uilder   /* WHER
2aff0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2b000 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  tion */.){.  Whe
2b010 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2b030 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2b040 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
2b050 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2b060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2b070 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2b080 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2b090 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
2b0a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2b0b0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2b0c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2b0d0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
2b0e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
2b0f0 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
2b100 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
2b110 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2b120 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2b130 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
2b140 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2b150 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
2b160 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
2b170 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2b180 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
2b190 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
2b1a0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
2b1b0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
2b1c0 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
2b1d0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
2b1e0 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b200 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
2b210 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
2b220 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
2b230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b240 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
2b250 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
2b260 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
2b270 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
2b2a0 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
2b2b0 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
2b2c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2b2d0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2b2e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
2b2f0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2b300 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
2b310 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2b320 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2b330 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
2b340 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2b350 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2b360 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
2b370 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
2b380 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
2b390 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2b3a0 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
2b3b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2b3c0 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
2b3d0 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
2b3e0 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
2b3f0 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
2b400 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
2b410 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
2b420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b430 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
2b440 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
2b450 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
2b460 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2b470 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2b480 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
2b490 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
2b4a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2b4b0 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
2b4c0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2b4d0 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
2b4e0 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2b4f0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2b500 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
2b510 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2b520 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
2b530 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2b540 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2b550 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b560 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2b570 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
2b580 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
2b590 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
2b5a0 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
2b5b0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
2b5c0 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
2b5d0 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
2b5e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b5f0 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
2b600 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
2b610 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2b620 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2b630 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2b640 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2b650 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2b660 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
2b670 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2b680 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
2b690 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
2b6a0 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2b6b0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
2b6c0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2b6d0 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
2b6e0 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
2b6f0 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
2b700 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
2b710 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
2b720 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b730 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
2b740 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2b750 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b760 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2b770 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
2b780 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b790 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2b7a0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2b7b0 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
2b7c0 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
2b7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b7e0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
2b7f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b810 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2b820 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2b830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2b840 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2b850 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
2b860 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
2b870 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
2b880 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2b890 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2b8a0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2b8b0 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
2b8c0 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
2b8d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b8e0 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
2b8f0 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2b900 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
2b910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2b920 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
2b930 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2b940 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
2b950 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b960 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
2b970 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2b980 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
2b990 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
2b9a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b9b0 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
2b9c0 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2b9d0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2b9e0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2b9f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2ba00 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2ba10 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
2ba20 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
2ba30 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2ba40 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
2ba50 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2ba60 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2ba70 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2ba80 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2ba90 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2baa0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2bab0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
2bac0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2bad0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2bae0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2baf0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2bb00 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
2bb10 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2bb20 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2bb30 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
2bb40 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
2bb50 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
2bb60 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
2bb70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2bb80 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2bb90 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
2bba0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
2bbb0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2bbc0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
2bbd0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2bbe0 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
2bbf0 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d  rereq = 0;.    m
2bc00 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
2bc10 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2bc20 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
2bc30 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
2bc40 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2bc50 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
2bc60 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
2bc70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2bc80 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
2bc90 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2bca0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2bcb0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
2bcc0 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
2bcd0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
2bce0 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
2bcf0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2bd00 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2bd10 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
2bd20 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
2bd30 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
2bd40 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
2bd50 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
2bd60 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
2bd70 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
2bd80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2bd90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2bda0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2bdb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2bdc0 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
2bdd0 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
2bde0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2bdf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
2be00 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2be10 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2be20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2be30 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
2be40 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
2be50 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
2be60 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2be70 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
2be80 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
2be90 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2bea0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
2beb0 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
2bec0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2bed0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bee0 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
2bef0 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
2bf00 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
2bf10 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
2bf20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
2bf30 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
2bf40 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
2bf50 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2bf60 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
2bf70 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2bf80 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
2bf90 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
2bfa0 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
2bfb0 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2bfc0 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
2bfd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2bfe0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2bff0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2c000 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
2c010 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
2c020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2c030 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
2c040 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
2c050 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
2c060 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
2c070 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
2c080 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
2c090 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
2c0a0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
2c0b0 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
2c0c0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
2c0d0 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
2c0e0 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
2c0f0 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
2c100 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
2c110 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
2c120 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
2c130 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
2c140 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c150 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2c160 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2c170 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
2c180 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
2c190 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
2c1a0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
2c1b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2c1c0 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
2c1d0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
2c1e0 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
2c1f0 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
2c200 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
2c210 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
2c220 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
2c230 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
2c240 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
2c250 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
2c260 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
2c270 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
2c280 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
2c290 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2c2a0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2c2b0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
2c2c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c2d0 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
2c2e0 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
2c2f0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2c300 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
2c310 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2c320 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
2c330 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
2c340 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
2c350 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
2c360 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
2c370 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2c380 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
2c390 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
2c3a0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2c3b0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2c3c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2c3d0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2c3e0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
2c3f0 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
2c400 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2c410 20 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66   = (u8)((pIdxInf
2c420 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a  o->nOrderBy!=0).
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c450 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f       && pIdxInfo
2c460 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2c470 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  d);.      pNew->
2c480 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2c490 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2c4a0 68 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f 75 62  hereCostFromDoub
2c4b0 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  le(pIdxInfo->est
2c4c0 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20  imatedCost);.   
2c4d0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 76     /* TUNING: Ev
2c4e0 65 72 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ery virtual tabl
2c4f0 65 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  e query returns 
2c500 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
2c510 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 36   pNew->nOut = 46
2c520 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77  ;  assert( 46==w
2c530 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a  hereCost(25) );.
2c540 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
2c550 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2c560 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
2c570 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2c580 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
2c590 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c5a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2c5b0 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
2c5c0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2c5d0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
2c5e0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
2c5f0 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2c600 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
2c610 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2c620 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
2c630 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
2c640 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
2c650 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2c660 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
2c670 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2c680 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c690 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
2c6a0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
2c6b0 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
2c6c0 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
2c6d0 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
2c6e0 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
2c6f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
2c700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2c710 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65  ereLoopAddOr(Whe
2c720 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2c730 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b  Builder, Bitmask
2c740 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72   mExtra){.  Wher
2c750 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
2c760 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2c770 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
2c780 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
2c790 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
2c7a0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
2c7b0 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
2c7c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2c7d0 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
2c7e0 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
2c7f0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2c800 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
2c810 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
2c820 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74  Cur, sPrev;.  st
2c830 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2c840 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
2c850 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
2c860 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  WC;.  if( pWInfo
2c870 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2c880 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20  HERE_AND_ONLY ) 
2c890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c8a0 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
2c8b0 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
2c8c0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2c8d0 64 65 72 2d 3e 70 4e 65 77 3b 0a 0a 20 20 66 6f  der->pNew;..  fo
2c8e0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2c8f0 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
2c900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2c910 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2c920 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2c930 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
2c940 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
2c950 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
2c960 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
2c970 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
2c980 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
2c990 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
2c9a0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2c9b0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2c9c0 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
2c9d0 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
2c9e0 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
2c9f0 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
2ca00 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
2ca10 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
2ca20 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
2ca30 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 70   j;.    .      p
2ca40 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
2ca50 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2ca60 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20 20 20 69  w->iTab;.      i
2ca70 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
2ca80 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 53 75 62  rsor;.      sSub
2ca90 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
2caa0 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
2cab0 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
2cac0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2cad0 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
2cae0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ..      for(pOrT
2caf0 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
2cb00 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
2cb10 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
2cb20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
2cb30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2cb40 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
2cb50 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2cb60 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
2cb70 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
2cb80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2cb90 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2cba0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
2cbb0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2cbc0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
2cbd0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2cbe0 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
2cbf0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
2cc00 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
2cc10 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
2cc20 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
2cc30 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2cc40 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
2cc50 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2cc60 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
2cc70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cc80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2cc90 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2cca0 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
2ccb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ccc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ccd0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2cce0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2ccf0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2cd00 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2cd10 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2cd20 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Build);.        
2cd30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43 75    for(i=0; i<sCu
2cd40 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e 61  r.n; i++) sCur.a
2cd50 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d 45  [i].prereq |= mE
2cd60 78 74 72 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  xtra;.        }e
2cd70 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2cd80 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2cd90 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2cda0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
2cdb0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2cdc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2cdd0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2cde0 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
2cdf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2ce00 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
2ce10 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2ce20 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2ce30 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2ce40 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
2ce50 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2ce60 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
2ce70 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
2ce80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2ce90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
2cea0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
2ceb0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
2cec0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2ced0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2cee0 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
2cef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2cf00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
2cf10 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
2cf20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
2cf30 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
2cf40 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
2cf50 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
2cf60 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2cf80 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65  hereCostAdd(sPre
2cf90 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
2cfa0 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43            whereC
2cfd0 6f 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  ostAdd(sPrev.a[i
2cfe0 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
2cff0 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
2d000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d010 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d020 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
2d030 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2d040 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2d050 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2d060 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2d070 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2d080 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2d090 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2d0a0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2d0b0 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
2d0c0 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2d0d0 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2d0e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2d0f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d100 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
2d110 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2d120 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20  NG: Multiple by 
2d130 33 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f  3.5 for the seco
2d140 6e 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b  ndary table look
2d150 75 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  up */.        pN
2d160 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
2d170 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a  a[i].rRun + 18;.
2d180 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2d190 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
2d1a0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
2d1b0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
2d1c0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
2d1d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d1e0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2d1f0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2d200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2d210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d220 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2d230 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2d240 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
2d250 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d260 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
2d270 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2d280 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2d290 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2d2a0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2d2b0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2d2c0 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
2d2d0 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
2d2e0 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
2d2f0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2d300 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2d310 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2d320 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2d330 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2d340 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2d350 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
2d360 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
2d370 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
2d380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
2d390 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
2d3a0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2d3b0 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
2d3c0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
2d3d0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
2d3e0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
2d3f0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
2d400 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
2d410 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
2d420 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
2d430 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
2d440 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
2d450 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
2d460 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
2d470 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
2d480 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
2d490 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2d4a0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
2d4b0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2d4c0 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
2d4d0 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
2d4e0 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
2d4f0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
2d500 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
2d510 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
2d520 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
2d530 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
2d540 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
2d550 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2d560 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
2d570 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2d580 74 75 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a  tual(pBuilder);.
2d590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d5a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2d5b0 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
2d5c0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2d5d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d5f0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2d600 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
2d610 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2d620 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
2d630 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
2d640 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
2d650 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2d660 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
2d670 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
2d680 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d690 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
2d6a0 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
2d6b0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
2d6c0 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
2d6d0 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
2d6e0 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
2d6f0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
2d700 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
2d710 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
2d720 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
2d730 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
2d740 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
2d750 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
2d760 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2d770 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2d780 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2d790 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2d7a0 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2d7b0 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2d7c0 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2d7d0 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2d7e0 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2d7f0 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e  his time.**.** N
2d800 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
2d810 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
2d820 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
2d830 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
2d840 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
2d850 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
2d860 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
2d870 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
2d880 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
2d890 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
2d8a0 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
2d8b0 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
2d8c0 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
2d8d0 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54  Y.** and DISTINT
2d8e0 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
2d8f0 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
2d900 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
2d910 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
2d920 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20  * as equivelent 
2d930 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
2d940 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
2d950 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
2d960 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
2d970 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
2d980 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
2d990 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
2d9a0 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
2d9b0 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
2d9c0 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
2d9d0 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
2d9e0 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
2d9f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2da00 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  t wherePathSatis
2da10 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
2da20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2da30 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
2da40 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2da50 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2da60 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
2da70 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
2da80 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
2da90 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
2daa0 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
2dab0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
2dac0 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
2dad0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2dae0 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
2daf0 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
2db00 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
2db10 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
2db20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
2db30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db40 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
2db50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2db60 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
2db70 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
2db80 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
2db90 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
2dba0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2dbb0 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
2dbc0 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
2dbd0 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
2dbe0 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
2dbf0 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
2dc00 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
2dc10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2dc20 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
2dc30 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
2dc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2dc50 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
2dc60 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
2dc70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dc80 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
2dc90 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2dca0 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
2dcb0 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
2dcc0 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
2dcd0 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
2dce0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
2dcf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2dd00 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
2dd10 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
2dd20 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
2dd30 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
2dd40 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
2dd50 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
2dd60 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2dd70 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
2dd80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dd90 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2dda0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
2ddb0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
2ddc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
2ddd0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
2dde0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
2ddf0 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
2de00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2de10 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
2de20 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
2de30 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
2de40 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
2de50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2de60 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2de70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2de80 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2de90 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
2dea0 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
2deb0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2dec0 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
2ded0 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
2dee0 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
2def0 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
2df00 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
2df10 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
2df20 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
2df30 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
2df40 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
2df50 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2df60 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
2df70 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
2df80 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2df90 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
2dfa0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
2dfb0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
2dfc0 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
2dfd0 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
2dfe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
2dff0 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
2e000 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
2e010 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
2e020 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
2e030 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
2e040 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2e050 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
2e060 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2e070 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2e080 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
2e090 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
2e0a0 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
2e0b0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
2e0c0 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
2e0d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2e0e0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2e0f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
2e100 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
2e110 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2e120 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
2e130 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
2e140 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
2e150 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
2e160 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
2e170 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
2e180 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2e190 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
2e1a0 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
2e1b0 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
2e1c0 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
2e1d0 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
2e1e0 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
2e1f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2e200 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
2e210 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
2e220 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
2e230 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2e240 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
2e250 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
2e260 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
2e270 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
2e280 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
2e290 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
2e2a0 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
2e2b0 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
2e2c0 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
2e2d0 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
2e2e0 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
2e2f0 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
2e300 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2e310 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
2e320 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
2e330 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
2e340 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
2e350 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
2e360 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
2e370 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2e380 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
2e390 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
2e3a0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
2e3b0 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2e3c0 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
2e3d0 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
2e3e0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
2e3f0 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
2e400 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
2e410 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2e420 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
2e430 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
2e440 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
2e450 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
2e460 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
2e470 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
2e480 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
2e490 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
2e4a0 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
2e4b0 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
2e4c0 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
2e4d0 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
2e4e0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
2e4f0 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
2e500 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2e510 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
2e520 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
2e530 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
2e540 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2e550 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
2e560 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
2e570 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
2e580 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2e590 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
2e5a0 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
2e5b0 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
2e5c0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2e5d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
2e5e0 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
2e5f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
2e600 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2e610 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2e620 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20  OrderBy!=0 );.. 
2e630 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20   /* Sortability 
2e640 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
2e650 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
2e660 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
2e670 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66  x method.  ** of
2e680 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2e690 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69  le itself */.  i
2e6a0 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67  f( pLast->wsFlag
2e6b0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2e6c0 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65  LTABLE ){.    te
2e6d0 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20  stcase( nLoop>0 
2e6e0 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e  );  /* True when
2e6f0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65   outer loops are
2e700 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74   one-row and mat
2e710 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch .            
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2e730 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72   no ORDER BY ter
2e740 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ms */.    return
2e750 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69   pLast->u.vtab.i
2e760 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20  sOrdered;.  }.  
2e770 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
2e780 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2e790 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
2e7a0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
2e7b0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
2e7c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
2e7d0 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
2e7e0 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
2e7f0 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
2e800 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
2e810 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
2e820 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
2e830 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
2e840 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
2e850 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
2e860 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
2e870 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
2e880 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2e890 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
2e8a0 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  0;.  for(iLoop=0
2e8b0 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
2e8c0 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
2e8d0 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
2e8e0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2e8f0 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
2e900 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
2e910 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f  askSelf;.    pLo
2e920 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
2e930 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
2e940 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
2e950 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2e960 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e970 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2e980 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72  )==0 );.    iCur
2e990 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2e9a0 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2e9b0 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
2e9c0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2e9d0 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
2e9e0 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
2e9f0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2ea00 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
2ea10 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
2ea20 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
2ea30 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
2ea40 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2ea50 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
2ea60 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
2ea70 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
2ea80 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
2ea90 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
2eaa0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2eab0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
2eac0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2ead0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2eae0 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2eaf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2eb00 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2eb10 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2eb20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2eb30 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2eb40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2eb50 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2eb60 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2eb70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2eb80 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2eb90 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
2eba0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
2ebb0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
2ebd0 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
2ebe0 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20  NULL, 0);.      
2ebf0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
2ec00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2ec10 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2ec20 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26  ator&WO_EQ)!=0 &
2ec30 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  & pOBExpr->iColu
2ec40 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2ec50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c   const char *z1,
2ec60 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43   *z2;.        pC
2ec70 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2ec80 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2ec90 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2eca0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2ecb0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2ecc0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2ecd0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2ece0 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e      z1 = pColl->
2ecf0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2ed00 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2ed10 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2ed20 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  ->pParse, pTerm-
2ed30 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
2ed40 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2ed50 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2ed60 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  oll;.        z2 
2ed70 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2ed80 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2ed90 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
2eda0 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)!=0 ) continue
2edb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2edc0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2edd0 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
2ede0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2edf0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2ee00 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
2ee10 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2ee20 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
2ee30 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
2ee40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2ee50 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20  olumn = 0;.     
2ee60 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2ee70 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2ee80 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2ee90 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2eea0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2eeb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2eec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2eed0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2eee0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
2eef0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2ef00 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  t = pIndex->onEr
2ef10 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
2ef20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2ef30 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
2ef40 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
2ef50 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
2ef60 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
2ef70 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
2ef80 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
2ef90 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
2efa0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
2efb0 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
2efc0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2efd0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
2efe0 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d  r(j=0; j<=nColum
2eff0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2f000 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2f010 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2f020 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2f030 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2f040 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2f050 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2f060 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2f070 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2f080 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2f090 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2f0a0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2f0b0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2f0c0 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
2f0d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f0e0 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
2f0f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2f100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2f110 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
2f120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2f130 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2f140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f150 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2f160 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
2f170 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
2f180 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
2f190 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
2f1a0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
2f1b0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
2f1c0 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
2f1d0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
2f1e0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2f1f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2f200 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  f( j<nColumn ){.
2f210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72            /* Nor
2f220 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  mal index column
2f230 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
2f240 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2f250 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2f260 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2f270 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
2f280 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
2f290 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
2f2a0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
2f2b0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
2f2c0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
2f2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2f2e0 20 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   The ROWID colum
2f2f0 6e 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a  n at the end */.
2f300 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f310 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( j==nColumn );.
2f320 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2f330 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2f340 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2f350 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f360 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2f370 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2f380 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2f390 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2f3a0 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2f3b0 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2f3c0 6f 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20  ordered .       
2f3d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2f3e0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
2f3f0 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
2f400 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
2f410 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
2f420 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2f430 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
2f440 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2f450 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
2f460 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f470 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2f480 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2f490 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
2f4a0 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
2f4b0 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
2f4c0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
2f4d0 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
2f4e0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
2f4f0 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68   and and mark th
2f500 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
2f510 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
2f520 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
2f530 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
2f540 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
2f550 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
2f560 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
2f570 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2f580 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2f590 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2f5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
2f5b0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2f5c0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2f5d0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2f5e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
2f5f0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2f600 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
2f610 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
2f620 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
2f630 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
2f640 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
2f650 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2f660 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
2f670 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
2f680 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
2f690 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
2f6a0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2f6b0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
2f6c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f6d0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2f6e0 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
2f6f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f700 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2f710 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
2f720 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
2f730 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2f740 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
2f750 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2f760 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2f770 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2f780 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2f790 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2f7a0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2f7b0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2f7c0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2f7d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2f7e0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
2f7f0 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
2f800 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
2f810 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2f820 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
2f830 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
2f840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2f850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2f860 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
2f870 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2f880 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2f890 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
2f8a0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
2f8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
2f8c0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2f8d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2f8e0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2f8f0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2f900 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
2f910 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2f920 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2f930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2f940 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
2f950 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
2f960 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
2f970 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2f980 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  use..           
2f990 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
2f9a0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
2f9b0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2f9c0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
2f9d0 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
2f9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2f9f0 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
2fa00 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
2fa10 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2fa20 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2fa30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fa40 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
2fa50 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
2fa60 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2fa70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fa80 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
2fa90 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
2faa0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
2fab0 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
2fac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2faf0 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
2fb00 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
2fb10 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
2fb20 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  <nColumn ){.    
2fb30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2fb40 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2fb50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2fb60 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2fb70 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2fb80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2fb90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2fba0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
2fbb0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2fbc0 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2fbd0 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
2fbe0 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
2fbf0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2fc00 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
2fc10 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
2fc20 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2fc30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
2fc40 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
2fc50 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
2fc60 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
2fc70 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
2fc80 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2fc90 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
2fca0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2fcb0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
2fcc0 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
2fcd0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2fce0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2fcf0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2fd00 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
2fd10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
2fd20 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2fd30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fd40 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
2fd50 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
2fd60 20 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72         if( (expr
2fd70 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e  TableUsage(&pWIn
2fd80 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29  fo->sMaskSet, p)
2fd90 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
2fda0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
2fdb0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2fdc0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
2fdd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2fde0 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
2fdf0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
2fe00 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
2fe10 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
2fe20 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
2fe30 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
2fe40 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  one ) return 1;.
2fe50 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
2fe60 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
2fe70 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
2fe80 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
2fe90 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
2fea0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
2feb0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
2fec0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
2fed0 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
2fee0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
2fef0 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
2ff00 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
2ff10 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
2ff20 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
2ff30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
2ff40 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
2ff50 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
2ff60 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
2ff70 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
2ff80 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
2ff90 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
2ffa0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
2ffb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
2ffc0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
2ffd0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
2ffe0 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
2fff0 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
30000 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
30010 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
30020 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
30030 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
30040 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
30050 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
30060 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
30070 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
30080 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
30090 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
300a0 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
300b0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
300c0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
300d0 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
300e0 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
300f0 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
30100 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
30110 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
30120 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
30130 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
30140 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
30150 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
30160 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
30170 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
30180 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
30190 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
301a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
301b0 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
301c0 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65  o *pWInfo, Where
301d0 43 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  Cost nRowEst){. 
301e0 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
301f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
30200 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
30210 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
30220 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
30230 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
30240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30250 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
30260 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
30270 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
30280 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
30290 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
302a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
302b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
302c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
302d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
302e0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
302f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30300 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
30310 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
30320 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
30330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30340 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
30350 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 43  /.  WhereCost rC
30360 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
30370 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
30380 74 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  th */.  WhereCos
30390 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
303a0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
303b0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
303c0 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72   paths */.  Wher
303d0 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b  eCost rSortCost;
303e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
303f0 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f   to do a sort */
30400 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
30410 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
30420 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
30430 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
30440 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
30450 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
30460 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
30470 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
30480 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
30490 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
304a0 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
304b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
304c0 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
304d0 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
304e0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
304f0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
30500 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
30510 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
30520 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
30530 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
30540 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
30550 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
30560 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
30570 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
30580 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
30590 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
305a0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
305b0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
305c0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
305d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
305e0 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
305f0 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
30600 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30620 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
30630 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
30640 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
30650 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
30660 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
30670 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
30680 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
30690 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
306a0 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
306b0 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
306c0 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
306d0 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
306e0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
306f0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
30700 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
30710 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
30720 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
30730 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
30740 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
30750 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20   = (nLoop==1) ? 
30760 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
30770 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
30780 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
30790 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
307a0 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
307b0 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
307c0 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
307d0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
307e0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
307f0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
30800 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
30810 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
30820 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
30830 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
30840 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
30850 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
30860 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
30870 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
30880 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30890 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
308a0 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
308b0 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
308c0 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
308d0 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
308e0 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
308f0 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
30900 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
30910 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
30920 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
30930 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
30940 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
30950 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
30960 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
30970 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
30980 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
30990 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
309a0 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
309b0 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
309c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
309d0 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
309e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
309f0 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
30a00 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
30a10 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
30a20 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
30a30 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
30a40 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
30a50 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
30a60 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
30a70 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
30a80 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
30a90 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
30aa0 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
30ab0 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
30ac0 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
30ad0 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  ost(25) );.  nFr
30ae0 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
30af0 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
30b00 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
30b10 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
30b20 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
30b30 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
30b40 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
30b50 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
30b60 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
30b70 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69  ortCost = 0;.  i
30b80 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
30b90 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
30ba0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
30bb0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
30bc0 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
30bd0 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  {.    /* TUNING:
30be0 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
30bf0 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a  of sorting is N*
30c00 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
30c10 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  is the.    ** nu
30c20 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
30c30 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72  ows. */.    rSor
30c40 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20  tCost = nRowEst 
30c50 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  + estLog(nRowEst
30c60 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
30c70 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73  E(0x002,("---- s
30c80 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22  ort cost=%-3d\n"
30c90 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20  , rSortCost));. 
30ca0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
30cb0 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
30cc0 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
30cd0 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
30ce0 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
30cf0 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
30d00 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
30d10 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
30d20 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
30d30 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
30d40 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
30d50 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
30d60 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
30d70 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
30d80 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
30d90 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
30da0 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
30db0 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
30dc0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
30dd0 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
30de0 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
30df0 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
30e00 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
30e10 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
30e20 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
30e30 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
30e40 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64          u8 isOrd
30e50 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f  eredValid = pFro
30e60 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  m->isOrderedVali
30e70 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  d;.        u8 is
30e80 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
30e90 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
30ea0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
30eb0 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
30ec0 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
30ed0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30ee0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
30ef0 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
30f00 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
30f10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30f20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
30f30 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
30f40 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
30f50 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
30f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
30f70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
30f80 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
30f90 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c  whereCostAdd(pWL
30fa0 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
30fb0 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
30fc0 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
30fd0 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f   rCost = whereCo
30fe0 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72  stAdd(rCost, pFr
30ff0 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20  om->rCost);.    
31000 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
31010 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
31020 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
31040 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b  sOrderedValid ){
31050 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
31060 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69  h( wherePathSati
31070 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
31080 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
31090 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
310a0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
310b0 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
310c0 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
310f0 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20  revMask) ){.    
31100 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
31110 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b   /* Yes.  pFrom+
31120 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69  pWLoop does sati
31130 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
31140 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
31150 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31160 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
31170 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
31180 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
31190 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
311a0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
311b0 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f  0:  /* No.  pFro
311c0 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65  m+pWLoop will re
311d0 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65  quire a separate
311e0 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20   sort */.       
311f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31210 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31220 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
31230 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
31240 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
31250 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20  , rSortCost);.  
31260 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
31270 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  k;.            d
31280 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f  efault: /* Canno
31290 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79  t tell yet.  Try
312a0 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65   again on the ne
312b0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
312d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
312e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
312f0 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
31300 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
31310 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
31320 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
31330 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
31340 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
31350 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20  to the mxChoice 
31360 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
31370 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
31380 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
31390 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
313a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
313b0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
313c0 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f  kNew && pTo->isO
313d0 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f  rderedValid==isO
313e0 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20  rderedValid ){. 
313f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
31400 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
31410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
31420 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
31430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31440 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
31450 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31460 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26  nTo>=mxChoice &&
31470 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29   rCost>=mxCost )
31480 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
31490 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
314a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
314b0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
314c0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
314d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
314e0 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
314f0 20 63 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d   cost=%3d order=
31500 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31510 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31520 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
31530 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
31540 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
31550 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31560 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
31570 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
31580 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31590 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
315a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
315b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
315c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
315d0 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68  a new Path to th
315e0 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20  e aTo[] set */. 
315f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
31600 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
31610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
31620 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
31630 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
31640 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
31650 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
31660 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
31670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31680 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
31690 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
316a0 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
316b0 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
316c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
316d0 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a  (jj=nTo-1; aTo[j
316e0 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b  j].rCost<mxCost;
316f0 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a   jj--){ assert(j
31700 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  j>0); }.        
31710 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
31720 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
31730 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
31740 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
31750 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
31760 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
31770 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31780 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e  e3DebugPrintf("N
31790 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  ew    %s cost=%-
317a0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317c0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
317d0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
317e0 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
317f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31800 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
31810 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31820 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31830 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31850 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
31860 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29  ->rCost<=rCost )
31870 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
31880 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31890 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
318a0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
318b0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
318c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
318d0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
318e0 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
318f0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
31900 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
31910 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31920 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
31930 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
31940 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
31950 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31960 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
31970 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31980 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
319a0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
319b0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f  s %s cost=%-3d o
319c0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
319e0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
319f0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
31a00 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  o->rCost,.      
31a10 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
31a20 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
31a30 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
31a40 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
31a50 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
31a60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31a70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31a80 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
31a90 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
31aa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
31ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
31ad0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
31ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
31af0 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65   A new and bette
31b00 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72  r score for a pr
31b10 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64  eviously created
31b20 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68   equivalent path
31b30 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
31b40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31b50 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31b60 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31b70 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31b80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31b90 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
31ba0 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
31bb0 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31bc0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
31bd0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31be0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31bf0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31c10 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31c20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31c30 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
31c50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31c60 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
31c70 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  %-3d order=%c\n"
31c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31c90 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
31ca0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
31cb0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
31cd0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
31ce0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
31cf0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31d00 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31d10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
31d30 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
31d40 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
31d50 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
31d60 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
31d70 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
31d80 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
31d90 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
31da0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
31db0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
31dc0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
31dd0 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d  o->nRow = pFrom-
31de0 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
31df0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54  nOut;.        pT
31e00 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  o->rCost = rCost
31e10 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
31e20 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
31e30 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a  isOrderedValid;.
31e40 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
31e50 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
31e60 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
31e70 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
31e80 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
31e90 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
31ea0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
31eb0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
31ec0 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
31ed0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
31ee0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
31ef0 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b     mxCost = aTo[
31f00 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  0].rCost;.      
31f10 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
31f20 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
31f30 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
31f40 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
31f50 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
31f60 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74  >mxCost ) mxCost
31f70 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
31f80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31f90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31fa0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
31fb0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
31fd0 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20  reTrace>=2 ){.  
31fe0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31ff0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
32000 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
32010 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
32020 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
32030 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
32040 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
32050 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32060 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
32070 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
32080 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
32090 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
320a0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
320b0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
320c0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
320d0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
320e0 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
320f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
32100 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
32110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
32120 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
32130 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  id && pTo->isOrd
32140 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
32150 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32160 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
32170 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
32180 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
32190 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
321a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
321b0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
321c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
321d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
321e0 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
321f0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
32200 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
32210 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
32220 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
32230 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
32240 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
32250 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
32260 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
32270 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
32280 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
32290 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
322a0 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
322b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
322c0 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
322d0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
322e0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
322f0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
32300 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
32310 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
32320 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
32330 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
32340 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  From;.  assert( 
32350 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23 69 66 20  nFrom==1 );.#if 
32360 30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  0 /* The followi
32370 6e 67 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  ng is needed if 
32380 6e 46 72 6f 6d 20 69 73 20 65 76 65 72 20 6d 6f  nFrom is ever mo
32390 72 65 20 74 68 61 6e 20 31 20 2a 2f 0a 20 20 66  re than 1 */.  f
323a0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
323b0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
323c0 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
323d0 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
323e0 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
323f0 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ii];.  }.#endif.
32400 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
32410 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
32420 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
32430 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
32440 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
32450 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
32460 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
32470 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
32480 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
32490 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
324a0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
324b0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
324c0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
324d0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
324e0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
324f0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
32500 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
32510 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32520 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
32530 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
32540 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
32550 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32560 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
32570 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
32580 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32590 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
325a0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
325b0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
325c0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
325d0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
325e0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
325f0 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
32600 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
32610 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
32620 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
32630 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
32640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32650 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
32660 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
32670 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
32680 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
32690 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20      if( rc==1 ) 
326a0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
326b0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
326c0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a  CT_ORDERED;.  }.
326d0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
326e0 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66  rdered ){.    if
326f0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
32710 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20  TINCTBY ){.     
32720 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
32730 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
32740 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
32750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
32760 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31  Info->bOBSat = 1
32770 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
32780 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
32790 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
327a0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52    }.  pWInfo->nR
327b0 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
327c0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
327d0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
327e0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
327f0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
32800 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
32810 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
32820 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32830 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
32840 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
32850 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
32860 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
32870 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
32880 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
32890 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
328a0 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
328b0 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
328c0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
328d0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
328e0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
328f0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
32900 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
32910 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
32920 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
32930 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
32940 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
32950 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
32960 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
32970 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
32980 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
32990 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
329a0 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
329b0 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
329c0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
329d0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
329e0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
329f0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
32a00 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
32a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32a20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
32a30 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
32a40 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
32a50 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
32a60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32a70 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
32a80 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
32a90 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
32aa0 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
32ab0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
32ac0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
32ad0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
32ae0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
32af0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
32b00 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
32b10 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
32b20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
32b30 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
32b40 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
32b50 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32b60 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
32b70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
32b80 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
32b90 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
32ba0 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
32bb0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
32bc0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
32bd0 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e  >zIndex ) return
32be0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
32bf0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
32c00 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
32c10 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
32c20 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
32c30 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32c40 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  0;.  pTerm = fin
32c50 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
32c60 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30   -1, 0, WO_EQ, 0
32c70 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
32c80 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  {.    pLoop->wsF
32c90 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
32ca0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
32cb0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
32cc0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
32cd0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
32ce0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
32cf0 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
32d00 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
32d10 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
32d20 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
32d30 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
32d40 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
32d50 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65   33;  /* 33==whe
32d60 72 65 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20  reCost(10) */.  
32d70 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
32d80 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
32d90 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
32da0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
32db0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
32dc0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
32dd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
32de0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
32df0 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
32e00 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
32e10 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
32e20 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
32e30 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70  [j], 0, WO_EQ, p
32e40 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
32e50 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
32e60 61 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ak;.        wher
32e70 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49 6e  eLoopResize(pWIn
32e80 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
32e90 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20  pLoop, j);.     
32ea0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
32eb0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
32ec0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
32ed0 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  !=pIdx->nColumn 
32ee0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32ef0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32f00 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
32f10 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
32f20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
32f30 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d       if( (pItem-
32f40 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
32f50 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
32f60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32f70 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
32f80 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
32f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32fa0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
32fb0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
32fc0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
32fd0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
32fe0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
32ff0 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
33000 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
33010 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
33020 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
33030 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
33040 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65   39;  /* 39==whe
33050 72 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20  reCost(15) */.  
33060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
33070 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
33080 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
33090 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
330a0 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 20  WhereCost)1;.   
330b0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
330c0 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
330d0 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
330e0 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
330f0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
33100 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
33110 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
33120 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
33130 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
33140 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33150 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
33160 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a  o->bOBSat =  1;.
33170 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33180 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33190 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
331a0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
331b0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
331c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
331d0 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
331e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
331f0 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
33200 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
33210 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
33220 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
33230 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
33240 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
33250 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
33260 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
33270 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
33280 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
33290 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
332a0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
332b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
332c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
332d0 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
332e0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
332f0 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
33300 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
33310 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
33320 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
33330 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
33340 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
33350 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
33360 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
33370 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
33380 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
33390 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
333a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
333b0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
333c0 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
333d0 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
333e0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
333f0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
33400 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
33410 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
33420 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
33430 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
33440 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
33450 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
33460 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
33470 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
33480 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
33490 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
334a0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
334b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
334c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
334d0 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
334e0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
334f0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
33500 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
33510 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
33520 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
33530 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
33540 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
33550 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
33560 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
33570 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
33580 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
33590 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
335a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
335b0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
335c0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
335d0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
335e0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
335f0 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
33600 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
33610 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
33640 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
33650 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
33680 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
33690 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
336a0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
336b0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
336c0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
336d0 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
336e0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
336f0 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
33700 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
33710 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
33720 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
33730 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
33740 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
33750 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
33760 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
33770 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
33780 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
33790 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
337a0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
337b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
337c0 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
337d0 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
337e0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
337f0 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
33800 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
33810 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
33820 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
33830 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
33840 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
33850 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
33860 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
33870 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
33880 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
33890 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
338a0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
338b0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
338c0 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
338d0 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
338e0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
338f0 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
33900 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
33910 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
33920 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
33930 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
33940 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
33950 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
33960 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
33970 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
33980 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
33990 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
339a0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
339b0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
339c0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
339d0 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
339e0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
339f0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
33a00 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
33a10 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
33a20 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
33a30 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
33a40 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
33a50 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
33a60 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
33a70 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
33a80 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
33a90 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
33aa0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
33ab0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
33ac0 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
33ad0 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
33ae0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
33af0 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
33b00 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
33b10 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
33b20 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
33b30 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
33b40 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33b50 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
33b60 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
33b70 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
33b80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
33b90 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
33ba0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
33bb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33bc0 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
33bd0 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
33be0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
33bf0 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
33c00 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
33c10 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
33c20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
33c30 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
33c40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
33c50 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
33c60 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
33c70 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
33c80 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
33c90 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
33ca0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
33cb0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
33cc0 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
33cd0 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
33ce0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
33cf0 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
33d00 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
33d10 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
33d20 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
33d30 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
33d40 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
33d50 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
33d60 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
33d70 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
33d80 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
33d90 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
33da0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
33db0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
33dc0 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
33dd0 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
33de0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
33df0 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
33e00 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
33e10 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
33e20 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
33e30 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
33e40 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
33e50 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
33e60 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
33e70 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
33e80 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
33e90 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
33ea0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
33eb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
33ec0 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
33ed0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
33ee0 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
33ef0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
33f00 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
33f10 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
33f20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
33f30 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
33f40 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
33f50 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
33f60 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
33f70 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
33f80 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
33f90 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
33fa0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
33fb0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  rBy is NULL..*/.
33fc0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
33fd0 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
33fe0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
33ff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
34000 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
34010 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
34020 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
34030 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
34040 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
34050 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
34060 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
34070 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
34080 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
34090 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
340a0 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
340b0 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
340c0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
340d0 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a   *pResultSet, /*
340e0 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
340f0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31  he query */.  u1
34100 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
34110 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
34120 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
34130 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
34140 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
34150 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
34160 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
34170 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
34180 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
34190 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
341a0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
341b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
341c0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
341d0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
341e0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
341f0 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
34200 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34210 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
34220 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
34230 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
34240 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
34250 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
34260 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
34270 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
34280 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
34290 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
342a0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
342b0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
342c0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
342d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
342e0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
342f0 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
34300 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
34310 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
34320 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
34330 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
34340 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
34350 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
34360 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
34370 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
34380 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
34390 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
343a0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
343b0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
343c0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
343d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
343e0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
343f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
34400 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34420 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
34430 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34450 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
34460 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
34470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34480 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
34490 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ode */...  /* Va
344a0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
344b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
344c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
344d0 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
344e0 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20  izeof(sWLB));.  
344f0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
34500 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
34510 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
34520 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
34530 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
34540 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
34550 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
34560 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
34570 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
34580 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
34590 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
345a0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
345b0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
345c0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
345d0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
345e0 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
345f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
34600 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
34610 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
34620 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
34630 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
34640 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
34650 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
34660 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
34670 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
34680 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
34690 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
346a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
346b0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
346c0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
346d0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
346e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
346f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
34700 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
34710 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
34720 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
34730 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
34740 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
34750 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
34760 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
34770 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
34780 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
34790 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
347a0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
347b0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
347c0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
347d0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
347e0 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
347f0 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
34800 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
34810 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
34820 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34830 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
34840 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
34850 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
34860 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
34870 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
34880 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
34890 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
348a0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
348b0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
348c0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
348d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
348e0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
348f0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
34900 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
34910 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
34920 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
34930 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
34940 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
34950 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
34960 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
34970 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
34980 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
34990 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
349a0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
349b0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
349c0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
349d0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
349e0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
349f0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
34a00 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
34a10 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
34a20 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
34a30 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
34a40 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
34a50 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
34a60 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
34a70 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
34a80 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
34a90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
34aa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
34ab0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
34ac0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
34ad0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34ae0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
34af0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
34b00 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34b10 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
34b20 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
34b30 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
34b40 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
34b50 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
34b60 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
34b70 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
34b80 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
34b90 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
34ba0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
34bb0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
34bc0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
34bd0 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
34be0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
34bf0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
34c00 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
34c10 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
34c20 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
34c30 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
34c40 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
34c50 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
34c60 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
34c70 26 70 57 49 6e 66 6f 2d 3e 61 5b 6e 54 61 62 4c  &pWInfo->a[nTabL
34c80 69 73 74 5d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  ist];.  whereLoo
34c90 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
34ca0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
34cb0 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
34cc0 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
34cd0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  ndif..  /* Split
34ce0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
34cf0 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
34d00 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
34d10 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
34d20 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
34d30 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
34d40 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
34d50 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
34d60 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
34d70 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70  ereClauseInit(&p
34d80 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e  WInfo->sWC, pWIn
34d90 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  fo);.  sqlite3Ex
34da0 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
34db0 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
34dc0 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70  .  whereSplit(&p
34dd0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
34de0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f  re, TK_AND);   /
34df0 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35  * IMP: R-15842-5
34e00 33 32 39 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  3296 */.  sqlite
34e10 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
34e20 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
34e30 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
34e40 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
34e50 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  o */.    .  /* S
34e60 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
34e70 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
34e80 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
34e90 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
34ea0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
34eb0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
34ec0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
34ed0 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
34ee0 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
34ef0 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
34f00 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
34f10 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
34f20 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
34f30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
34f40 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
34f50 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
34f60 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
34f70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
34f80 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
34f90 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
34fa0 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
34fb0 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
34fc0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
34fd0 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
34fe0 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
34ff0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
35000 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
35010 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
35020 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
35030 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
35040 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
35050 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
35060 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
35070 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
35080 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
35090 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
350a0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
350b0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
350c0 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
350d0 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
350e0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
350f0 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
35100 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
35110 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
35120 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
35130 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
35140 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
35150 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
35160 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
35170 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
35180 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
35190 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
351a0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
351b0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
351c0 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
351d0 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
351e0 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
351f0 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
35200 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
35210 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
35220 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
35230 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
35240 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
35250 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
35260 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
35270 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
35280 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
35290 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
352a0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
352b0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
352c0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
352d0 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
352e0 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
352f0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
35300 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
35310 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
35320 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
35330 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
35340 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
35350 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
35360 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
35370 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
35380 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
35390 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
353a0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
353b0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
353c0 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
353d0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
353e0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
353f0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
35400 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
35410 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
35420 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
35430 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
35440 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
35450 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
35460 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
35470 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
35480 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
35490 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
354a0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
354b0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
354c0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
354d0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
354e0 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
354f0 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
35500 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
35510 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
35520 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
35530 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
35540 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
35550 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
35560 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
35570 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
35580 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
35590 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
355a0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
355b0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
355c0 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
355d0 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
355e0 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
355f0 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
35600 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
35610 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
35620 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
35630 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
35640 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
35650 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
35660 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
35670 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
35680 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
35690 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
356a0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
356b0 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
356c0 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
356d0 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  ) clause contain
356e0 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
356f0 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70  general.  ** exp
35700 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77  ressions, then w
35710 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20  e won't be able 
35720 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73  to satisfy it us
35730 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a  ing indices, so.
35740 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
35750 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77  d disable it now
35760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
35770 64 65 72 42 79 20 26 26 20 28 77 63 74 72 6c 46  derBy && (wctrlF
35780 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
35790 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29  T_DISTINCT)!=0 )
357a0 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  {.    for(ii=0; 
357b0 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  ii<pOrderBy->nEx
357c0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
357d0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
357e0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
357f0 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
35800 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
35810 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
35820 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
35830 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
35840 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
35850 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
35860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
35870 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
35880 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
35890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
358a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
358b0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
358c0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
358d0 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
358e0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
358f0 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
35900 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
35910 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
35920 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
35930 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
35940 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
35950 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
35960 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
35970 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
35980 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
35990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
359a0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
359b0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
359c0 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
359d0 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
359e0 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
359f0 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
35a00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
35a10 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
35a20 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
35a30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
35a40 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
35a50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
35a60 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
35a70 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
35a80 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
35a90 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
35aa0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
35ab0 29 29 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  ));.  if( nTabLi
35ac0 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
35ad0 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
35ae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
35af0 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
35b00 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
35b10 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
35b20 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f  nError;.  .    /
35b30 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
35b40 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
35b50 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
35b60 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
35b70 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
35b80 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
35b90 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35ba0 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
35bb0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
35bc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
35bd0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
35be0 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
35bf0 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
35c00 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
35c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c30 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
35c40 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
35c50 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
35c60 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
35c70 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
35c80 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
35c90 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
35ca0 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
35cb0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
35cc0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
35cd0 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  p, pTabList);.  
35ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
35cf0 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
35d00 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35d10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
35d20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35d30 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35d40 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
35d50 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
35d60 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
35d70 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35d80 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
35d90 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
35da0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35db0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
35dc0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
35dd0 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
35de0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
35df0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
35e00 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
35e10 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
35e20 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
35e30 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
35e40 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
35e50 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
35e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
35e70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
35e80 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35e90 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
35ea0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
35eb0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
35ec0 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
35ed0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
35ee0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
35ef0 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
35f00 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
35f10 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
35f20 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20  nfo->bOBSat ){. 
35f30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35f40 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
35f50 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  Y=0x%llx", pWInf
35f60 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
35f70 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
35f80 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35f90 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
35fa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
35fb0 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
35fc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
35fd0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
35fe0 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
35ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36000 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
36010 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
36020 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
36030 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36040 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
36050 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
36060 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36070 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36080 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
36090 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
360a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
360b0 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
360c0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
360d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
360e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
360f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
36100 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
36110 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
36120 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
36130 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
36140 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
36150 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
36160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
36170 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
36180 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
36190 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
361a0 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
361b0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
361c0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
361d0 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
361e0 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
361f0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
36200 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
36210 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
36220 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
36230 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74  bUsed = exprList
36240 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
36250 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
36260 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
36270 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20  By ) tabUsed |= 
36280 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
36290 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  ge(pMaskSet, pOr
362a0 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c  derBy);.    whil
362b0 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
362c0 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
362d0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
362e0 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
362f0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
36300 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
36310 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
36320 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
36330 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
36340 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  Tab].jointype & 
36350 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
36360 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
36370 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36380 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
36390 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
363a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
363b0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
363c0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
363d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
363e0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
363f0 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
36400 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
36410 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
36420 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
36430 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
36440 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
36450 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
36460 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
36470 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
36480 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
36490 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
364a0 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
364b0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
364c0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
364d0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
364e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
364f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36500 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36510 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
36520 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
36530 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
36540 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
36550 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
36560 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
36570 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
36580 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
36590 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
365a0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
365b0 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
365c0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
365d0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
365e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
365f0 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
36600 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
36610 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
36620 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
36630 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
36640 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
36650 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
36660 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
36670 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
36680 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
36690 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
366a0 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
366b0 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
366c0 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
366d0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
366e0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
366f0 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
36700 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
36710 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
36720 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36730 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
36740 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
36750 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
36760 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
36770 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
36780 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28  RED)!=0 .   && (
36790 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
367a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
367b0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20  HERE_ONEROW)!=0 
367c0 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
367d0 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
367e0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
367f0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
36800 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
36810 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
36820 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
36830 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
36840 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
36850 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
36860 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
36870 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ables..  */.  no
36880 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
36890 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
368a0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
368b0 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
368c0 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
368d0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
368e0 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
368f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
36900 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
36910 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
36920 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
36930 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
36940 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
36950 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
36960 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
36970 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
36980 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
36990 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
369a0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
369b0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
369c0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
369d0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
369e0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
369f0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
36a00 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
36a10 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
36a20 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
36a30 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
36a40 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
36a50 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
36a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36a70 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
36a80 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36a90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
36aa0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
36ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36ac0 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
36ad0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
36ae0 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
36af0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
36b00 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
36b10 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
36b20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
36b30 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
36b40 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
36b50 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
36b60 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
36b70 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
36b80 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
36b90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
36ba0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
36bb0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
36bc0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
36bd0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
36be0 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
36bf0 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
36c00 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
36c10 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36c20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
36c30 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
36c40 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
36c50 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
36c60 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
36c70 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
36c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36c90 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
36ca0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
36cb0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
36cc0 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
36cd0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
36ce0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
36cf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
36d00 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36d10 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
36d20 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
36d30 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
36d40 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
36d50 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
36d60 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
36d70 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
36d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36d90 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
36da0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
36db0 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
36de0 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
36df0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
36e00 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
36e10 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
36e20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36e30 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
36e40 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
36e50 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
36e60 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
36e70 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
36e80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
36e90 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
36ea0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
36eb0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
36ec0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
36ed0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
36ee0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
36ef0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
36f00 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
36f10 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
36f20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
36f30 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
36f40 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
36f50 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
36f60 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
36f70 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
36f80 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
36f90 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
36fa0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
36fb0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
36fc0 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
36fd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
36fe0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
36ff0 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
37000 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
37010 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
37020 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
37030 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
37040 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
37050 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
37060 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
37070 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
37080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37090 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
370a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
370b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
370c0 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
370d0 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
370e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
370f0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
37100 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
37110 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
37120 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
37130 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
37140 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
37150 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
37160 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
37170 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
37180 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
37190 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
371a0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
371b0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
371c0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
371d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
371e0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
371f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37200 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
37210 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
37220 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
37230 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
37240 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
37250 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
37260 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
37270 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
37280 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
37290 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
372a0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
372b0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
372c0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
372d0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
372e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
372f0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
37300 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
37310 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
37320 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
37330 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
37340 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
37350 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
37360 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
37370 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
37380 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
37390 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
373a0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
373b0 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
373c0 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ne. */.  return 
373d0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
373e0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
373f0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
37400 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
37410 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
37420 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
37430 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
37440 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
37450 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
37460 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
37470 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
37480 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
37490 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
374a0 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
374b0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
374c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
374d0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
374e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
374f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
37500 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
37510 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
37520 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
37530 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
37540 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
37550 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
37560 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
37570 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
37580 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
37590 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
375a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
375b0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
375c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
375d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
375e0 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
375f0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
37600 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
37610 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
37620 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
37630 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
37640 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
37650 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
37660 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
37670 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
37680 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37690 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
376a0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
376b0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
376c0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
376d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
376e0 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
376f0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
37700 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
37710 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
37720 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
37730 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
37740 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
37750 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
37760 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
37770 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
37780 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
37790 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
377a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
377b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
377c0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
377d0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
377e0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
377f0 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
37800 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
37810 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
37820 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
37830 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
37840 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
37850 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
37860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37870 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
37880 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
37890 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
378a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
378b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
378c0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
378d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
378e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
378f0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
37900 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
37910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
37920 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
37930 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
37940 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
37950 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
37960 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
37970 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
37980 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37990 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
379a0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
379b0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
379c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
379d0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
379e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
379f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37a00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
37a10 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
37a20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
37a30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
37a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
37a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
37a60 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
37a70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
37a80 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
37a90 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
37aa0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
37ab0 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
37ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37ad0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
37ae0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
37af0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
37b00 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
37b10 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
37b20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37b40 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
37b50 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
37b60 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
37b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
37b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37b90 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
37ba0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
37bb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
37bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
37bd0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
37be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
37bf0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
37c00 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
37c10 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
37c20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
37c30 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
37c40 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
37c50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
37c60 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
37c70 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
37c80 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
37c90 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
37ca0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
37cb0 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
37cc0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
37cd0 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
37ce0 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
37cf0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
37d00 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
37d10 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
37d20 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
37d30 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
37d40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
37d50 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
37d60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
37d70 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
37d80 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
37d90 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
37da0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
37db0 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  0 );.    pLoop =
37dc0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
37dd0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
37de0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
37df0 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
37e00 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
37e10 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
37e20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
37e30 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
37e40 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
37e50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
37e60 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
37e70 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
37e80 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
37e90 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
37ea0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
37eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37ec0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
37ed0 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
37ee0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
37ef0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
37f00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
37f10 21 3d 30 20 26 26 20 28 77 73 20 26 20 28 57 48  !=0 && (ws & (WH
37f20 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55  ERE_IPK|WHERE_AU
37f30 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b  TO_INDEX))==0 ){
37f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37f50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37f60 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
37f70 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
37f80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
37f90 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
37fa0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
37fb0 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
37fc0 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
37fd0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
37fe0 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
37ff0 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
38000 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
38010 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
38020 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
38030 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
38040 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
38050 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
38060 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
38070 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
38080 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
38090 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
380a0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
380b0 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
380c0 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
380d0 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
380e0 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
380f0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
38100 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
38110 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
38120 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
38130 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
38140 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
38150 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
38160 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
38170 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
38180 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
38190 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
381a0 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
381b0 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
381c0 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
381d0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
381e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
381f0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
38200 44 45