/ Hex Artifact Content
Login

Artifact 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 31 31 2d 31 32  /*.** 2013-11-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 73 74 72 75 63 74 75  contains structu
0190: 72 65 20 61 6e 64 20 6d 61 63 72 6f 20 64 65 66  re and macro def
01a0: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
01b0: 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65   query.** planne
01c0: 72 20 6c 6f 67 69 63 20 69 6e 20 22 77 68 65 72  r logic in "wher
01d0: 65 2e 63 22 2e 20 20 54 68 65 73 65 20 64 65 66  e.c".  These def
01e0: 69 6e 69 74 69 6f 6e 73 20 61 72 65 20 62 72 6f  initions are bro
01f0: 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 0a 2a 2a 20  ken out into.** 
0200: 61 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  a separate sourc
0210: 65 20 66 69 6c 65 20 66 6f 72 20 65 61 73 69 65  e file for easie
0220: 72 20 65 64 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 2f  r editing..*/../
0230: 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70 75  *.** Trace outpu
0240: 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66 20  t macros.*/.#if 
0250: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
0260: 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
0270: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
0280: 2a 2a 2f 20 65 78 74 65 72 6e 20 69 6e 74 20 73  **/ extern int s
0290: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
02a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
02b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
02c0: 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65 66  G) \.    && (def
02d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
02e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
02f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
0300: 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e 65  TRACE)).# define
0310: 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29   WHERETRACE(K,X)
0320: 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72    if(sqlite3Wher
0330: 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c 69  eTrace&(K)) sqli
0340: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58  te3DebugPrintf X
0350: 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 54  .# define WHERET
0360: 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a 23  RACE_ENABLED 1.#
0370: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57 48  else.# define WH
0380: 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23 65  ERETRACE(K,X).#e
0390: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
03a0: 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a 74   references.*/.t
03b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
03c0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
03d0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
03e0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
03f0: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0420: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0430: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0440: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0450: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0460: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0470: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0480: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
0490: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04b0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
04e0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
04f0: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0500: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0510: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0520: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0530: 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65 64  WhereScan;.typed
0540: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0550: 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f 73  rCost WhereOrCos
0560: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0570: 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68 65  t WhereOrSet Whe
0580: 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a 20  reOrSet;../*.** 
0590: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
05a0: 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ains information
05b0: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
05c0: 6d 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 6e 65  ment a single ne
05d0: 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69 6e 20  sted.** loop in 
05e0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
05f0: 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74 68 69  .** Contrast thi
0600: 73 20 6f 62 6a 65 63 74 20 77 69 74 68 20 57 68  s object with Wh
0610: 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73 20 6f  ereLoop.  This o
0620: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
0630: 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
0640: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
0650: 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 64 65  p.  WhereLoop de
0660: 73 63 72 69 62 65 73 20 74 68 65 20 61 6c 67 6f  scribes the algo
0670: 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73 20 6f  rithm..** This o
0680: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
0690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
06a0: 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f 72 69  WhereLoop algori
06b0: 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a 2a 2a  thm as one of.**
06c0: 20 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a   its elements..*
06d0: 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 49 6e  *.** The WhereIn
06e0: 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  fo object contai
06f0: 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  ns a single inst
0700: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
0710: 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  ect for.** each 
0720: 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
0730: 20 63 6c 61 75 73 65 20 28 77 68 69 63 68 20 69   clause (which i
0740: 73 20 74 6f 20 73 61 79 2c 20 66 6f 72 20 65 61  s to say, for ea
0750: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 73  ch of the.** nes
0760: 74 65 64 20 6c 6f 6f 70 73 20 61 73 20 69 6d 70  ted loops as imp
0770: 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54 68 65 20  lemented).  The 
0780: 6f 72 64 65 72 20 6f 66 20 57 68 65 72 65 4c 65  order of WhereLe
0790: 76 65 6c 20 6f 62 6a 65 63 74 73 20 64 65 74 65  vel objects dete
07a0: 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20 6c 6f  rmines.** the lo
07b0: 6f 70 20 6e 65 73 74 65 64 20 6f 72 64 65 72 2c  op nested order,
07c0: 20 77 69 74 68 20 57 68 65 72 65 49 6e 66 6f 2e   with WhereInfo.
07d0: 61 5b 30 5d 20 62 65 69 6e 67 20 74 68 65 20 6f  a[0] being the o
07e0: 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a 2a 2a  uter loop and.**
07f0: 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57 68 65   WhereInfo.a[Whe
0800: 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d 31 5d  reInfo.nLevel-1]
0810: 20 62 65 69 6e 67 20 74 68 65 20 69 6e 6e 65 72   being the inner
0820: 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75 63 74   loop..*/.struct
0830: 20 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a 20 20   WhereLevel {.  
0840: 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b 20 20  int iLeftJoin;  
0850: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
0860: 63 65 6c 6c 20 75 73 65 64 20 74 6f 20 69 6d 70  cell used to imp
0870: 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55 54 45  lement LEFT OUTE
0880: 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e 74 20  R JOIN */.  int 
0890: 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
08a0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
08b0: 72 73 6f 72 20 75 73 65 64 20 74 6f 20 61 63 63  rsor used to acc
08c0: 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ess the table */
08d0: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
08e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
08f0: 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64  VDBE cursor used
0900: 20 74 6f 20 61 63 63 65 73 73 20 70 49 64 78 20   to access pIdx 
0910: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
0920: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
0930: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
0940: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
0950: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
0960: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  t;          /* J
0970: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 74 61 72  ump here to star
0980: 74 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 6f  t the next IN co
0990: 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  mbination */.  i
09a0: 6e 74 20 61 64 64 72 53 6b 69 70 3b 20 20 20 20  nt addrSkip;    
09b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
09c0: 65 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61  e for next itera
09d0: 74 69 6f 6e 20 6f 66 20 73 6b 69 70 2d 73 63 61  tion of skip-sca
09e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  n */.  int addrC
09f0: 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ont;         /* 
0a00: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
0a10: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
0a20: 65 78 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a  ext loop cycle *
0a30: 2f 0a 20 20 69 6e 74 20 61 64 64 72 46 69 72 73  /.  int addrFirs
0a40: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  t;        /* Fir
0a50: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  st instruction o
0a60: 66 20 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68  f interior of th
0a70: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0a80: 61 64 64 72 42 6f 64 79 3b 20 20 20 20 20 20 20  addrBody;       
0a90: 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
0aa0: 66 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  f the body of th
0ab0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 23 69 66 6e 64  is loop */.#ifnd
0ac0: 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44  ef SQLITE_LIKE_D
0ad0: 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42  OESNT_MATCH_BLOB
0ae0: 53 0a 20 20 75 33 32 20 69 4c 69 6b 65 52 65 70  S.  u32 iLikeRep
0af0: 43 6e 74 72 3b 20 20 20 20 20 2f 2a 20 4c 49 4b  Cntr;     /* LIK
0b00: 45 20 72 61 6e 67 65 20 70 72 6f 63 65 73 73 69  E range processi
0b10: 6e 67 20 63 6f 75 6e 74 65 72 20 72 65 67 69 73  ng counter regis
0b20: 74 65 72 20 28 74 69 6d 65 73 20 32 29 20 2a 2f  ter (times 2) */
0b30: 0a 20 20 69 6e 74 20 61 64 64 72 4c 69 6b 65 52  .  int addrLikeR
0b40: 65 70 3b 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45  ep;      /* LIKE
0b50: 20 72 61 6e 67 65 20 70 72 6f 63 65 73 73 69 6e   range processin
0b60: 67 20 61 64 64 72 65 73 73 20 2a 2f 0a 23 65 6e  g address */.#en
0b70: 64 69 66 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20  dif.  u8 iFrom; 
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0b90: 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  hich entry in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
0bb0: 0a 20 20 75 38 20 6f 70 2c 20 70 33 2c 20 70 35  .  u8 op, p3, p5
0bc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  ;        /* Opco
0bd0: 64 65 2c 20 50 33 20 26 20 50 35 20 6f 66 20 74  de, P3 & P5 of t
0be0: 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65  he opcode that e
0bf0: 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  nds the loop */.
0c00: 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20    int p1, p2;   
0c10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
0c20: 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  nds of the opcod
0c30: 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74  e used to ends t
0c40: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69  he loop */.  uni
0c50: 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  on {            
0c60: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
0c70: 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f  n that depends o
0c80: 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  n pWLoop->wsFlag
0c90: 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  s */.    struct 
0ca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b  {.      int nIn;
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0cc0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0cd0: 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20  es in aInLoop[] 
0ce0: 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
0cf0: 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20  InLoop {.       
0d00: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  by this IN opera
0d40: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tor */.        i
0d50: 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20  nt addrInTop;   
0d60: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
0d70: 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20  the IN loop */. 
0d80: 20 20 20 20 20 20 20 69 6e 74 20 69 42 61 73 65         int iBase
0d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0da0: 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 6f   Base register o
0db0: 66 20 6d 75 6c 74 69 2d 6b 65 79 20 69 6e 64 65  f multi-key inde
0dc0: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20  x record */.    
0dd0: 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b      int nPrefix;
0de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0df0: 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 6e  mber of prior en
0e00: 74 69 72 65 73 20 69 6e 20 74 68 65 20 6b 65 79  tires in the key
0e10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20 65   */.        u8 e
0e20: 45 6e 64 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20  EndLoopOp;      
0e30: 20 20 20 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65     /* IN Loop te
0e40: 72 6d 69 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78  rminator. OP_Nex
0e50: 74 20 6f 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a  t or OP_Prev */.
0e60: 20 20 20 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70        } *aInLoop
0e70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
0e80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
0e90: 20 65 61 63 68 20 6e 65 73 74 65 64 20 49 4e 20   each nested IN 
0ea0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
0eb0: 7d 20 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  } in;           
0ec0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68        /* Used wh
0ed0: 65 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  en pWLoop->wsFla
0ee0: 67 73 26 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  gs&WHERE_IN_ABLE
0ef0: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
0f00: 43 6f 76 69 64 78 3b 20 20 20 20 20 20 20 2f 2a  Covidx;       /*
0f10: 20 50 6f 73 73 69 62 6c 65 20 63 6f 76 65 72 69   Possible coveri
0f20: 6e 67 20 69 6e 64 65 78 20 66 6f 72 20 57 48 45  ng index for WHE
0f30: 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20  RE_MULTI_OR */. 
0f40: 20 7d 20 75 3b 0a 20 20 73 74 72 75 63 74 20 57   } u;.  struct W
0f50: 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
0f60: 3b 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74  ;  /* The select
0f70: 65 64 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ed WhereLoop obj
0f80: 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
0f90: 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
0fa0: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 65 6e 74 72      /* FROM entr
0fb0: 69 65 73 20 6e 6f 74 20 75 73 61 62 6c 65 20 61  ies not usable a
0fc0: 74 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a  t this level */.
0fd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
0fe0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
0ff0: 41 54 55 53 0a 20 20 69 6e 74 20 61 64 64 72 56  ATUS.  int addrV
1000: 69 73 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  isit;        /* 
1010: 41 64 64 72 65 73 73 20 61 74 20 77 68 69 63 68  Address at which
1020: 20 72 6f 77 20 69 73 20 76 69 73 69 74 65 64 20   row is visited 
1030: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1040: 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
1050: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
1060: 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20 61   represents an a
1070: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 65 76 61  lgorithm for eva
1080: 6c 75 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 74  luating one.** t
1090: 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20  erm of a join.  
10a0: 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  Every term of th
10b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  e FROM clause wi
10c0: 6c 6c 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  ll have at least
10d0: 0a 2a 2a 20 6f 6e 65 20 63 6f 72 72 65 73 70 6f  .** one correspo
10e0: 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
10f0: 6f 62 6a 65 63 74 20 28 75 6e 6c 65 73 73 20 49  object (unless I
1100: 4e 44 45 58 45 44 20 42 59 20 63 6f 6e 73 74 72  NDEXED BY constr
1110: 61 69 6e 74 73 0a 2a 2a 20 70 72 65 76 65 6e 74  aints.** prevent
1120: 20 61 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f   a query solutio
1130: 6e 20 2d 20 77 68 69 63 68 20 69 73 20 61 6e 20  n - which is an 
1140: 65 72 72 6f 72 29 20 61 6e 64 20 6d 61 6e 79 20  error) and many 
1150: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
1160: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c  FROM clause will
1170: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 57   have multiple W
1180: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1190: 2c 20 65 61 63 68 20 64 65 73 63 72 69 62 69 6e  , each describin
11a0: 67 20 61 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  g a.** potential
11b0: 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
11c0: 74 69 6e 67 20 74 68 61 74 20 46 52 4f 4d 2d 63  ting that FROM-c
11d0: 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 6f 67 65  lause term, toge
11e0: 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 64 65 70  ther with.** dep
11f0: 65 6e 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f  endencies and co
1200: 73 74 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  st estimates for
1210: 20 75 73 69 6e 67 20 74 68 65 20 63 68 6f 73 65   using the chose
1220: 6e 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a  n algorithm..**.
1230: 2a 2a 20 51 75 65 72 79 20 70 6c 61 6e 6e 69 6e  ** Query plannin
1240: 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 62 75  g consists of bu
1250: 69 6c 64 69 6e 67 20 75 70 20 61 20 63 6f 6c 6c  ilding up a coll
1260: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ection of these 
1270: 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a  WhereLoop.** obj
1280: 65 63 74 73 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ects, then compu
1290: 74 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  ting a particula
12a0: 72 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68  r sequence of Wh
12b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c  ereLoop objects,
12c0: 20 77 69 74 68 0a 2a 2a 20 6f 6e 65 20 57 68 65   with.** one Whe
12d0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 70 65  reLoop object pe
12e0: 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  r FROM clause te
12f0: 72 6d 2c 20 74 68 61 74 20 73 61 74 69 73 66 79  rm, that satisfy
1300: 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65   all dependencie
1310: 73 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 6d 69  s.** and that mi
1320: 6e 69 6d 69 7a 65 20 74 68 65 20 6f 76 65 72 61  nimize the overa
1330: 6c 6c 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 72 75  ll cost..*/.stru
1340: 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 7b 0a 20  ct WhereLoop {. 
1350: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 3b   Bitmask prereq;
1360: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
1370: 6b 20 6f 66 20 6f 74 68 65 72 20 6c 6f 6f 70 73  k of other loops
1380: 20 74 68 61 74 20 6d 75 73 74 20 72 75 6e 20 66   that must run f
1390: 69 72 73 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  irst */.  Bitmas
13a0: 6b 20 6d 61 73 6b 53 65 6c 66 3b 20 20 20 20 20  k maskSelf;     
13b0: 2f 2a 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74  /* Bitmask ident
13c0: 69 66 79 69 6e 67 20 74 61 62 6c 65 20 69 54 61  ifying table iTa
13d0: 62 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  b */.#ifdef SQLI
13e0: 54 45 5f 44 45 42 55 47 0a 20 20 63 68 61 72 20  TE_DEBUG.  char 
13f0: 63 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  cId;            
1400: 20 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 49 44 20   /* Symbolic ID 
1410: 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 66 6f 72  of this loop for
1420: 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 2a   debugging use *
1430: 2f 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 69 54  /.#endif.  u8 iT
1440: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
1450: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 69 6e 20   /* Position in 
1460: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1470: 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20 6c 6f  able for this lo
1480: 6f 70 20 2a 2f 0a 20 20 75 38 20 69 53 6f 72 74  op */.  u8 iSort
1490: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx;          /*
14a0: 20 53 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   Sorting index n
14b0: 75 6d 62 65 72 2e 20 20 30 3d 3d 4e 6f 6e 65 20  umber.  0==None 
14c0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 65 74  */.  LogEst rSet
14d0: 75 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  up;        /* On
14e0: 65 2d 74 69 6d 65 20 73 65 74 75 70 20 63 6f 73  e-time setup cos
14f0: 74 20 28 65 78 3a 20 63 72 65 61 74 65 20 74 72  t (ex: create tr
1500: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 29 20 2a  ansient index) *
1510: 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 3b  /.  LogEst rRun;
1520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
1530: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 65 61 63  t of running eac
1540: 68 20 6c 6f 6f 70 20 2a 2f 0a 20 20 4c 6f 67 45  h loop */.  LogE
1550: 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
1560: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
1570: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1580: 72 6f 77 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  rows */.  union 
1590: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 20 20  {.    struct {  
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
15c0: 69 6e 74 65 72 6e 61 6c 20 62 74 72 65 65 20 74  internal btree t
15d0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 75  ables */.      u
15e0: 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  16 nEq;         
15f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1600: 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  of equality cons
1610: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1620: 20 75 31 36 20 6e 42 74 6d 3b 20 20 20 20 20 20   u16 nBtm;      
1630: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1640: 6f 66 20 42 54 4d 20 76 65 63 74 6f 72 20 2a 2f  of BTM vector */
1650: 0a 20 20 20 20 20 20 75 31 36 20 6e 54 6f 70 3b  .      u16 nTop;
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1670: 20 53 69 7a 65 20 6f 66 20 54 4f 50 20 76 65 63   Size of TOP vec
1680: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 75 31 36  tor */.      u16
1690: 20 6e 49 64 78 43 6f 6c 3b 20 20 20 20 20 20 20   nIdxCol;       
16a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c      /* Index col
16b0: 75 6d 6e 20 75 73 65 64 20 66 6f 72 20 4f 52 44  umn used for ORD
16c0: 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 49  ER BY */.      I
16d0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
16e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
16f0: 73 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  sed, or NULL */.
1700: 20 20 20 20 7d 20 62 74 72 65 65 3b 0a 20 20 20      } btree;.   
1710: 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20   struct {       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
1730: 6d 61 74 69 6f 6e 20 66 6f 72 20 76 69 72 74 75  mation for virtu
1740: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  al tables */.   
1750: 20 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20     int idxNum;  
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1770: 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  ex number */.   
1780: 20 20 20 75 38 20 6e 65 65 64 46 72 65 65 3b 20     u8 needFree; 
1790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17a0: 65 20 69 66 20 73 71 6c 69 74 65 33 5f 66 72 65  e if sqlite3_fre
17b0: 65 28 69 64 78 53 74 72 29 20 69 73 20 6e 65 65  e(idxStr) is nee
17c0: 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 38 20  ded */.      i8 
17d0: 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20  isOrdered;      
17e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
17f0: 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42  atisfies ORDER B
1800: 59 20 2a 2f 0a 20 20 20 20 20 20 75 31 36 20 6f  Y */.      u16 o
1810: 6d 69 74 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  mitMask;        
1820: 20 20 2f 2a 20 54 65 72 6d 73 20 74 68 61 74 20    /* Terms that 
1830: 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 2a  may be omitted *
1840: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 69 64  /.      char *id
1850: 78 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xStr;          /
1860: 2a 20 49 6e 64 65 78 20 69 64 65 6e 74 69 66 69  * Index identifi
1870: 65 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  er string */.   
1880: 20 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a   } vtab;.  } u;.
1890: 20 20 75 33 32 20 77 73 46 6c 61 67 73 3b 20 20    u32 wsFlags;  
18a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
18b0: 5f 2a 20 66 6c 61 67 73 20 64 65 73 63 72 69 62  _* flags describ
18c0: 69 6e 67 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a  ing the plan */.
18d0: 20 20 75 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20    u16 nLTerm;   
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18f0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1900: 61 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 75 31  aLTerm[] */.  u1
1910: 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  6 nSkip;        
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 4e 55 4c 4c 20 61 4c 54 65 72 6d 5b 5d 20 65   NULL aLTerm[] e
1940: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 2f 2a 2a 2a  ntries */.  /***
1950: 2a 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  * whereLoopXfer(
1960: 29 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20  ) copies fields 
1970: 61 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  above **********
1980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
1990: 20 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f   define WHERE_LO
19a0: 4f 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65  OP_XFER_SZ offse
19b0: 74 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c  tof(WhereLoop,nL
19c0: 53 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c  Slot).  u16 nLSl
19d0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ot;           /*
19e0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
19f0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
1a00: 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  LTerm[] */.  Whe
1a10: 72 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b  reTerm **aLTerm;
1a20: 20 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73     /* WhereTerms
1a30: 20 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65   used */.  Where
1a40: 4c 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b  Loop *pNextLoop;
1a50: 20 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f   /* Next WhereLo
1a60: 6f 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  op object in the
1a70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a   WhereClause */.
1a80: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54    WhereTerm *aLT
1a90: 65 72 6d 53 70 61 63 65 5b 33 5d 3b 20 20 2f 2a  ermSpace[3];  /*
1aa0: 20 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b   Initial aLTerm[
1ab0: 5d 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f  ] space */.};../
1ac0: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f  * This object ho
1ad0: 6c 64 73 20 74 68 65 20 70 72 65 72 65 71 75 69  lds the prerequi
1ae0: 73 69 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f  sites and the co
1af0: 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a  st of running a.
1b00: 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f  ** subquery on o
1b10: 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ne operand of an
1b20: 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   OR operator in 
1b30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1b40: 2e 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72  ..** See WhereOr
1b50: 53 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Set for addition
1b60: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a  al information .
1b70: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1b80: 72 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73  rCost {.  Bitmas
1b90: 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a  k prereq;     /*
1ba0: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 2a   Prerequisites *
1bb0: 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 3b  /.  LogEst rRun;
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
1bd0: 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  of running this 
1be0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 4c 6f  subquery */.  Lo
1bf0: 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20  gEst nOut;      
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1c10: 75 74 70 75 74 73 20 66 6f 72 20 74 68 69 73 20  utputs for this 
1c20: 73 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a  subquery */.};..
1c30: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
1c40: 74 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61  t object holds a
1c50: 20 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65   set of possible
1c60: 20 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68   WhereOrCosts th
1c70: 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1c80: 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1c90: 28 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65  (s) of OR-clause
1ca0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e   processing.  On
1cb0: 6c 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e  ly the.** best N
1cc0: 5f 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74  _OR_COST element
1cd0: 73 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a  s are retained..
1ce0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f  */.#define N_OR_
1cf0: 43 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57 68  COST 3.struct Wh
1d00: 65 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36  ereOrSet {.  u16
1d10: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d30: 65 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20  er of valid a[] 
1d40: 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65  entries */.  Whe
1d50: 72 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f  reOrCost a[N_OR_
1d60: 43 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20  COST];   /* Set 
1d70: 6f 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f  of best costs */
1d80: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
1d90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1da0: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20   object holds a 
1db0: 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72  sequence of Wher
1dc0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a  eLoop objects.**
1dd0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
1de0: 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61  some or all of a
1df0: 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a   query plan..**.
1e00: 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61 63 68  ** Think of each
1e10: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1e20: 74 20 61 73 20 61 20 6e 6f 64 65 20 69 6e 20 61  t as a node in a
1e30: 20 67 72 61 70 68 20 77 69 74 68 20 61 72 63 73   graph with arcs
1e40: 0a 2a 2a 20 73 68 6f 77 69 6e 67 20 64 65 70 65  .** showing depe
1e50: 6e 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73  ndencies and cos
1e60: 74 73 20 66 6f 72 20 74 72 61 76 65 6c 6c 69 6e  ts for travellin
1e70: 67 20 62 65 74 77 65 65 6e 20 6e 6f 64 65 73 2e  g between nodes.
1e80: 20 20 28 54 68 61 74 20 69 73 0a 2a 2a 20 6e 6f    (That is.** no
1e90: 74 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 61  t a completely a
1ea0: 63 63 75 72 61 74 65 20 64 65 73 63 72 69 70 74  ccurate descript
1eb0: 69 6f 6e 20 62 65 63 61 75 73 65 20 57 68 65 72  ion because Wher
1ec0: 65 4c 6f 6f 70 20 63 6f 73 74 73 20 61 72 65 20  eLoop costs are 
1ed0: 61 0a 2a 2a 20 76 65 63 74 6f 72 2c 20 6e 6f 74  a.** vector, not
1ee0: 20 61 20 73 63 61 6c 61 72 2c 20 61 6e 64 20 62   a scalar, and b
1ef0: 65 63 61 75 73 65 20 64 65 70 65 6e 64 65 6e 63  ecause dependenc
1f00: 69 65 73 20 61 72 65 20 6d 61 6e 79 2d 74 6f 2d  ies are many-to-
1f10: 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d  one, not.** one-
1f20: 74 6f 2d 6f 6e 65 20 61 73 20 61 72 65 20 67 72  to-one as are gr
1f30: 61 70 68 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  aph nodes.  But 
1f40: 69 74 20 69 73 20 61 20 75 73 65 66 75 6c 20 76  it is a useful v
1f50: 69 73 75 61 6c 69 7a 61 74 69 6f 6e 20 61 69 64  isualization aid
1f60: 2e 29 0a 2a 2a 20 54 68 65 6e 20 61 20 57 68 65  .).** Then a Whe
1f70: 72 65 50 61 74 68 20 6f 62 6a 65 63 74 20 69 73  rePath object is
1f80: 20 61 20 70 61 74 68 20 74 68 72 6f 75 67 68 20   a path through 
1f90: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 76  the graph that v
1fa0: 69 73 69 74 73 20 73 6f 6d 65 0a 2a 2a 20 6f 72  isits some.** or
1fb0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
1fc0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e  eLoop objects on
1fd0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73  ce..**.** The "s
1fe0: 6f 6c 76 65 72 22 20 77 6f 72 6b 73 20 62 79 20  olver" works by 
1ff0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 4e 20 62  creating the N b
2000: 65 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62  est WherePath ob
2010: 6a 65 63 74 73 20 6f 66 20 6c 65 6e 67 74 68 0a  jects of length.
2020: 2a 2a 20 31 2e 20 20 54 68 65 6e 20 75 73 69 6e  ** 1.  Then usin
2030: 67 20 74 68 6f 73 65 20 61 73 20 61 20 62 61 73  g those as a bas
2040: 69 73 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  is to compute th
2050: 65 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61  e N best WherePa
2060: 74 68 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 6f 66  th objects.** of
2070: 20 6c 65 6e 67 74 68 20 32 2e 20 20 41 6e 64 20   length 2.  And 
2080: 73 6f 20 66 6f 72 74 68 20 75 6e 74 69 6c 20 74  so forth until t
2090: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 57 68 65  he length of Whe
20a0: 72 65 50 61 74 68 73 20 65 71 75 61 6c 73 20 74  rePaths equals t
20b0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
20c0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 46 52 4f  nodes in the FRO
20d0: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 62  M clause.  The b
20e0: 65 73 74 20 28 6c 6f 77 65 73 74 20 63 6f 73 74  est (lowest cost
20f0: 29 20 57 68 65 72 65 50 61 74 68 0a 2a 2a 20 61  ) WherePath.** a
2100: 74 20 74 68 65 20 65 6e 64 20 69 73 20 74 68 65  t the end is the
2110: 20 63 68 6f 73 65 6e 20 71 75 65 72 79 20 70 6c   chosen query pl
2120: 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  an..*/.struct Wh
2130: 65 72 65 50 61 74 68 20 7b 0a 20 20 42 69 74 6d  erePath {.  Bitm
2140: 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20  ask maskLoop;   
2150: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
2160: 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2170: 6a 65 63 74 73 20 69 6e 20 74 68 69 73 20 70 61  jects in this pa
2180: 74 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  th */.  Bitmask 
2190: 72 65 76 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  revLoop;      /*
21a0: 20 61 4c 6f 6f 70 5b 5d 73 20 74 68 61 74 20 73   aLoop[]s that s
21b0: 68 6f 75 6c 64 20 62 65 20 72 65 76 65 72 73 65  hould be reverse
21c0: 64 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 2a  d for ORDER BY *
21d0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 3b  /.  LogEst nRow;
21e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
21f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2200: 20 72 6f 77 73 20 67 65 6e 65 72 61 74 65 64 20   rows generated 
2210: 62 79 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  by this path */.
2220: 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20    LogEst rCost; 
2230: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2240: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 70 61   cost of this pa
2250: 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  th */.  LogEst r
2260: 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 2f 2a  Unsorted;     /*
2270: 20 54 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74   Total cost of t
2280: 68 69 73 20 70 61 74 68 20 69 67 6e 6f 72 69 6e  his path ignorin
2290: 67 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20  g sorting costs 
22a0: 2a 2f 0a 20 20 69 38 20 69 73 4f 72 64 65 72 65  */.  i8 isOrdere
22b0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  d;         /* No
22c0: 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  . of ORDER BY te
22d0: 72 6d 73 20 73 61 74 69 73 66 69 65 64 2e 20 2d  rms satisfied. -
22e0: 31 20 66 6f 72 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  1 for unknown */
22f0: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61  .  WhereLoop **a
2300: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61  Loop;    /* Arra
2310: 79 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  y of WhereLoop o
2320: 62 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74  bjects implement
2330: 69 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f  ing this path */
2340: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71  .};../*.** The q
2350: 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75  uery generator u
2360: 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ses an array of 
2370: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69  instances of thi
2380: 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  s structure to.*
2390: 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a  * help it analyz
23a0: 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  e the subexpress
23b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52  ions of the WHER
23c0: 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20  E clause.  Each 
23d0: 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
23e0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
23f0: 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
2400: 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e  the others by AN
2410: 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  D operators,.** 
2420: 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65  usually, or some
2430: 74 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73  times subexpress
2440: 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62  ions separated b
2450: 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  y OR..**.** All 
2460: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
2470: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
2480: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
2490: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
24a0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24b0: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
24c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
24d0: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
24e0: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
24f0: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
2500: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
2510: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2520: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2530: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
2540: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2550: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
2560: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2570: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
2580: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
2590: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
25a0: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  and WhereTerm.u.
25b0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72  leftColumn recor
25c0: 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  d the.** cursor 
25d0: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
25e0: 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20  n number for X. 
25f0: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
2600: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
2610: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
2620: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
2630: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
2640: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
2650: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
2660: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
2670: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
2680: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
2690: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
26a0: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
26b0: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
26c0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
26d0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68  tors..**.** A Wh
26e0: 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c  ereTerm might al
26f0: 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72  so be two or mor
2700: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
2710: 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a  cted by OR:.**.*
2720: 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20  *         (t1.X 
2730: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
2740: 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.Y <op> <expr
2750: 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a  >) OR .....**.**
2760: 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20   In this second 
2770: 63 61 73 65 2c 20 77 74 46 6c 61 67 20 68 61 73  case, wtFlag has
2780: 20 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f   the TERM_ORINFO
2790: 20 62 69 74 20 73 65 74 20 61 6e 64 20 65 4f 70   bit set and eOp
27a0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a  erator==WO_OR.**
27b0: 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 54 65   and the WhereTe
27c0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66 69 65  rm.u.pOrInfo fie
27d0: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 75 78  ld points to aux
27e0: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
27f0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f  on that.** is co
2800: 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20 74 68  llected about th
2810: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  e OR clause..**.
2820: 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20  ** If a term in 
2830: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2840: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2850: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2860: 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61  o previous.** ca
2870: 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65  tegories, then e
2880: 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68  Operator==0.  Th
2890: 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70  e WhereTerm.pExp
28a0: 72 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c  r field is still
28b0: 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f   set.** to the o
28c0: 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65  riginal subexpre
28d0: 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e  ssion content an
28e0: 64 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74  d wtFlags is set
28f0: 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c   up appropriatel
2900: 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65  y.** but no othe
2910: 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  r fields in the 
2920: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
2930: 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e   are meaningful.
2940: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65  .**.** When eOpe
2950: 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71  rator!=0, prereq
2960: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
2970: 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20  All record sets 
2980: 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  of cursor number
2990: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64  s,.** but they d
29a0: 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e  o so indirectly.
29b0: 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65    A single Where
29c0: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
29d0: 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20  e translates.** 
29e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
29f0: 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20  to bits and the 
2a00: 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69  translated bit i
2a10: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2a20: 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73  prereq.** fields
2a30: 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  .  The translati
2a40: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72  on is used in or
2a50: 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20  der to maximize 
2a60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
2a70: 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20   bits that will 
2a80: 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  fit in a Bitmask
2a90: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
2aa0: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
2ab0: 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75   be.** spread ou
2ac0: 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e  t over the non-n
2ad0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
2ae0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2af0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  the cursor.** nu
2b00: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33  mbers might be 3
2b10: 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20  , 8, 9, 10, 20, 
2b20: 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20  23, 41, and 45. 
2b30: 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   The WhereMaskSe
2b40: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
2b50: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
2b60: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
2b70: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
2b80: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
2b90: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
2ba0: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
2bb0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
2bc0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
2bd0: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
2be0: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
2bf0: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
2c00: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
2c10: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
2c20: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
2c30: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
2c40: 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  gh 7..**.** The 
2c50: 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
2c60: 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d  in a join is lim
2c70: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2c80: 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e  er of bits.** in
2c90: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2ca0: 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65   prereqAll.  The
2cb0: 20 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62   default is 64 b
2cc0: 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74  its, hence SQLit
2cd0: 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c  e.** is only abl
2ce0: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69  e to process joi
2cf0: 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65  ns with 64 or fe
2d00: 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  wer tables..*/.s
2d10: 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20  truct WhereTerm 
2d20: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d40: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75  ointer to the su
2d50: 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
2d60: 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   is this term */
2d70: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2d80: 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC;       /* Th
2d90: 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65  e clause this te
2da0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f  rm is part of */
2db0: 0a 20 20 4c 6f 67 45 73 74 20 74 72 75 74 68 50  .  LogEst truthP
2dc0: 72 6f 62 3b 20 20 20 20 20 20 20 2f 2a 20 50 72  rob;       /* Pr
2dd0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 74 72 75  obability of tru
2de0: 74 68 20 66 6f 72 20 74 68 69 73 20 65 78 70 72  th for this expr
2df0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  ession */.  u16 
2e00: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
2e10: 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20      /* TERM_xxx 
2e20: 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20  bit flags.  See 
2e30: 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 31 36 20 65  below */.  u16 e
2e40: 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20  Operator;       
2e50: 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61     /* A WO_xx va
2e60: 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c  lue describing <
2e70: 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69  op> */.  u8 nChi
2e80: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
2ea0: 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74  ildren that must
2eb0: 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20   disable us */. 
2ec0: 20 75 38 20 65 4d 61 74 63 68 4f 70 3b 20 20 20   u8 eMatchOp;   
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 20 66           /* Op f
2ee0: 6f 72 20 76 74 61 62 20 4d 41 54 43 48 2f 4c 49  or vtab MATCH/LI
2ef0: 4b 45 2f 47 4c 4f 42 2f 52 45 47 45 58 50 20 74  KE/GLOB/REGEXP t
2f00: 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  erms */.  int iP
2f10: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
2f20: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43    /* Disable pWC
2f30: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65  ->a[iParent] whe
2f40: 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61  n this term disa
2f50: 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  bled */.  int le
2f60: 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  ftCursor;       
2f70: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2f80: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
2f90: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
2fa0: 69 6e 74 20 69 46 69 65 6c 64 3b 20 20 20 20 20  int iField;     
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
2fc0: 20 69 6e 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28   in (?,?,?) IN (
2fd0: 53 45 4c 45 43 54 2e 2e 2e 29 20 76 65 63 74 6f  SELECT...) vecto
2fe0: 72 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  r */.  union {. 
2ff0: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
3000: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
3010: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
3020: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
3030: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
3040: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
3050: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
3060: 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65  rmation if (eOpe
3070: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
3080: 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41 6e  0 */.    WhereAn
3090: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
30a0: 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d   /* Extra inform
30b0: 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72 61  ation if (eOpera
30c0: 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  tor& WO_AND)!=0 
30d0: 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 42 69 74 6d  */.  } u;.  Bitm
30e0: 61 73 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b  ask prereqRight;
30f0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
3100: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 62 79  f tables used by
3110: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a   pExpr->pRight *
3120: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
3130: 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42  eqAll;      /* B
3140: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
3150: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70   referenced by p
3160: 45 78 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Expr */.};../*.*
3170: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
3180: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74   of WhereTerm.wt
3190: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
31a0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20   TERM_DYNAMIC   
31b0: 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20   0x01   /* Need 
31c0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45  to call sqlite3E
31d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
31e0: 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  xpr) */.#define 
31f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20  TERM_VIRTUAL    
3200: 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20  0x02   /* Added 
3210: 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
3220: 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a  .  Do not code *
3230: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43  /.#define TERM_C
3240: 4f 44 45 44 20 20 20 20 20 20 30 78 30 34 20 20  ODED      0x04  
3250: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73   /* This term is
3260: 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a   already coded *
3270: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43  /.#define TERM_C
3280: 4f 50 49 45 44 20 20 20 20 20 30 78 30 38 20 20  OPIED     0x08  
3290: 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20   /* Has a child 
32a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
32b0: 4f 52 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20  ORINFO     0x10 
32c0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65    /* Need to fre
32d0: 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  e the WhereTerm.
32e0: 75 2e 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  u.pOrInfo object
32f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
3300: 5f 41 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30  _ANDINFO    0x20
3310: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72     /* Need to fr
3320: 65 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  ee the WhereTerm
3330: 2e 75 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20  .u.pAndInfo obj 
3340: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
3350: 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20  OR_OK      0x40 
3360: 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67    /* Used during
3370: 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65   OR-clause proce
3380: 73 73 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  ssing */.#ifdef 
3390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
33a0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 23 20 20  AT3_OR_STAT4.#  
33b0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
33c0: 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d  L    0x80   /* M
33d0: 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55  anufactured x>NU
33e0: 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65  LL or x<=NULL te
33f0: 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64  rm */.#else.#  d
3400: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
3410: 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69      0x00   /* Di
3420: 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73  sabled if not us
3430: 69 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e  ing stat3 */.#en
3440: 64 69 66 0a 23 64 65 66 69 6e 65 20 54 45 52 4d  dif.#define TERM
3450: 5f 4c 49 4b 45 4f 50 54 20 20 20 20 30 78 31 30  _LIKEOPT    0x10
3460: 30 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 65  0  /* Virtual te
3470: 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  rms from the LIK
3480: 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a  E optimization *
3490: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4c  /.#define TERM_L
34a0: 49 4b 45 43 4f 4e 44 20 20 20 30 78 32 30 30 20  IKECOND   0x200 
34b0: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 6c   /* Conditionall
34c0: 79 20 74 68 69 73 20 4c 49 4b 45 20 6f 70 65 72  y this LIKE oper
34d0: 61 74 6f 72 20 74 65 72 6d 20 2a 2f 0a 23 64 65  ator term */.#de
34e0: 66 69 6e 65 20 54 45 52 4d 5f 4c 49 4b 45 20 20  fine TERM_LIKE  
34f0: 20 20 20 20 20 30 78 34 30 30 20 20 2f 2a 20 54       0x400  /* T
3500: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 49 4b 45  he original LIKE
3510: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65   operator */.#de
3520: 66 69 6e 65 20 54 45 52 4d 5f 49 53 20 20 20 20  fine TERM_IS    
3530: 20 20 20 20 20 30 78 38 30 30 20 20 2f 2a 20 54       0x800  /* T
3540: 65 72 6d 2e 70 45 78 70 72 20 69 73 20 61 6e 20  erm.pExpr is an 
3550: 49 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23  IS operator */.#
3560: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 41 52 53  define TERM_VARS
3570: 45 4c 45 43 54 20 20 30 78 31 30 30 30 20 2f 2a  ELECT  0x1000 /*
3580: 20 54 65 72 6d 2e 70 45 78 70 72 20 63 6f 6e 74   Term.pExpr cont
3590: 61 69 6e 73 20 61 20 63 6f 72 72 65 6c 61 74 65  ains a correlate
35a0: 64 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 0a  d sub-query */..
35b0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
35c0: 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 53 63  e of the WhereSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  an object is use
35e0: 64 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f 72  d as an iterator
35f0: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a   for locating.**
3600: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
3610: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
3620: 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74 68  are useful to th
3630: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
3640: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
3650: 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 43 6c  Scan {.  WhereCl
3660: 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20  ause *pOrigWC;  
3670: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c      /* Original,
3680: 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65   innermost Where
3690: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
36a0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36b0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43         /* WhereC
36c0: 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20  lause currently 
36d0: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
36e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
36f0: 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  CollName;     /*
3700: 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74   Required collat
3710: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69 66  ing sequence, if
3720: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45   not NULL */.  E
3730: 78 70 72 20 2a 70 49 64 78 45 78 70 72 3b 20 20  xpr *pIdxExpr;  
3740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
3750: 72 63 68 20 66 6f 72 20 74 68 69 73 20 69 6e 64  rch for this ind
3760: 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex expression */
3770: 0a 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 20  .  char idxaff; 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3790: 20 4d 75 73 74 20 6d 61 74 63 68 20 74 68 69 73   Must match this
37a0: 20 61 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43   affinity, if zC
37b0: 6f 6c 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f  ollName!=NULL */
37c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
37d0: 20 6e 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a   nEquiv;      /*
37e0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
37f0: 65 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a  es in aEquiv[] *
3800: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
3810: 72 20 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f  r iEquiv;      /
3820: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c  * Next unused sl
3830: 6f 74 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a  ot in aEquiv[] *
3840: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20  /.  u32 opMask; 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3860: 2a 20 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65  * Acceptable ope
3870: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
3880: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
3890: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65         /* Resume
38a0: 20 73 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69   scanning at thi
38b0: 73 2d 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e  s->pWC->a[this->
38c0: 6b 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 75  k] */.  int aiCu
38d0: 72 5b 31 31 5d 3b 20 20 20 20 20 20 20 20 20 20  r[11];          
38e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 69 6e     /* Cursors in
38f0: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 63 65   the equivalence
3900: 20 63 6c 61 73 73 20 2a 2f 0a 20 20 69 31 36 20   class */.  i16 
3910: 61 69 43 6f 6c 75 6d 6e 5b 31 31 5d 3b 20 20 20  aiColumn[11];   
3920: 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 73         /* Corres
3930: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  ponding column n
3940: 75 6d 62 65 72 20 69 6e 20 74 68 65 20 65 71 2d  umber in the eq-
3950: 63 6c 61 73 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  class */.};../*.
3960: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
3970: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3980: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
3990: 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
39a0: 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45  about a.** WHERE
39b0: 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79   clause.  Mostly
39c0: 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61   this is a conta
39d0: 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20  iner for one or 
39e0: 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e  more WhereTerms.
39f0: 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74 69  .**.** Explanati
3a00: 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20 46  on of pOuter:  F
3a10: 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  or a WHERE claus
3a20: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  e of the form.**
3a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20  .**           a 
3a40: 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20 4f  AND ((b AND c) O
3a50: 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e 44  R (d AND e)) AND
3a60: 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61   f.**.** There a
3a70: 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65 72  re separate Wher
3a80: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73 20  eClause objects 
3a90: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
3aa0: 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a 20  ause and for.** 
3ab0: 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20 22  the subclauses "
3ac0: 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20 22  (b AND c)" and "
3ad0: 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68 65  (d AND e)".  The
3ae0: 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f 66   pOuter field of
3af0: 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75 73   the.** subclaus
3b00: 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  es points to the
3b10: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3b20: 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f 6c  ect for the whol
3b30: 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 72  e clause..*/.str
3b40: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
3b50: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
3b60: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a 20  WInfo;       /* 
3b70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
3b80: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
3b90: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
3ba0: 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f 2a   *pOuter;     /*
3bb0: 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74 69   Outer conjuncti
3bc0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20  on */.  u8 op;  
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74   /* Split operat
3bf0: 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54  or.  TK_AND or T
3c00: 4b 5f 4f 52 20 2a 2f 0a 20 20 75 38 20 68 61 73  K_OR */.  u8 has
3c10: 4f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Or;             
3c20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
3c30: 79 20 61 5b 5d 2e 65 4f 70 65 72 61 74 6f 72 20  y a[].eOperator 
3c40: 69 73 20 57 4f 5f 4f 52 20 2a 2f 0a 20 20 69 6e  is WO_OR */.  in
3c50: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
3c60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3c70: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
3c80: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
3c90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ca0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3cb0: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
3cc0: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
3cd0: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
3ce0: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
3cf0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
3d00: 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  se */.#if define
3d10: 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53  d(SQLITE_SMALL_S
3d20: 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72  TACK).  WhereTer
3d30: 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20  m aStatic[1];   
3d40: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
3d50: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
3d60: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72   */.#else.  Wher
3d70: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d  eTerm aStatic[8]
3d80: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
3d90: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
3da0: 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d   a[] */.#endif.}
3db0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65  ;../*.** A Where
3dc0: 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61  Term with eOpera
3dd0: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69  tor==WO_OR has i
3de0: 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69  ts u.pOrInfo poi
3df0: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3e00: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3e10: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3e20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3e30: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3e40: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
3e50: 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  o {.  WhereClaus
3e60: 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f  e wc;          /
3e70: 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
3e80: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
3e90: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
3ea0: 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42  able;       /* B
3eb0: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e  itmask of all in
3ec0: 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69  dexable tables i
3ed0: 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a  n the clause */.
3ee0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
3ef0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
3f00: 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73  ator==WO_AND has
3f10: 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20   its u.pAndInfo 
3f20: 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a  pointer set to.*
3f30: 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  * a dynamically 
3f40: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e  allocated instan
3f50: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3f60: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
3f70: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  /.struct WhereAn
3f80: 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  dInfo {.  WhereC
3f90: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
3fa0: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70     /* The subexp
3fb0: 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f  ression broken o
3fc0: 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ut */.};../*.** 
3fd0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3ff0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61  ucture keeps tra
4000: 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a  ck of a mapping.
4010: 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20  ** between VDBE 
4020: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  cursor numbers a
4030: 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62  nd bits of the b
4040: 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65  itmasks in Where
4050: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
4060: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
4070: 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e  ers are small in
4080: 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64  tegers contained
4090: 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f   in .** SrcList_
40a0: 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64  item.iCursor and
40b0: 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65   Expr.iTable fie
40c0: 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69  lds.  For any gi
40d0: 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c  ven WHERE .** cl
40e0: 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  ause, the cursor
40f0: 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e   numbers might n
4100: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20  ot begin with 0 
4110: 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a  and they might.*
4120: 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69  * contain gaps i
4130: 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20  n the numbering 
4140: 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77  sequence.  But w
4150: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d  e want to make m
4160: 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66  aximum.** use of
4170: 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72   the bits in our
4180: 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73   bitmasks.  This
4190: 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69   structure provi
41a0: 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a  des a mapping.**
41b0: 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65   from the sparse
41c0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
41d0: 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65  into consecutive
41e0: 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e   integers beginn
41f0: 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a  ing.** with 0..*
4200: 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73  *.** If WhereMas
4210: 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74  kSet.ix[A]==B it
4220: 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65 20   means that The 
4230: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42 69  A-th bit of a Bi
4240: 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  tmask.** corresp
4250: 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f 72  onds VDBE cursor
4260: 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20   number B.  The 
4270: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62 69  A-th bit of a bi
4280: 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a  tmask is 1<<A..*
4290: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
42a0: 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  , if the WHERE c
42b0: 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
42c0: 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42 45   used these VDBE
42d0: 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c  .** cursors:  4,
42e0: 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37   5, 8, 29, 57, 7
42f0: 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57 68  3.  Then the  Wh
4300: 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
4310: 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61  ture.** would ma
4320: 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e  p those cursor n
4330: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73  umbers into bits
4340: 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a   0 through 5..**
4350: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
4360: 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
4370: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64   necessarily ord
4380: 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78  ered.  In the ex
4390: 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20  ample.** above, 
43a0: 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68  the mapping migh
43b0: 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20  t go like this: 
43c0: 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e   4->3, 5->1, 8->
43d0: 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d  2, 29->0,.** 57-
43e0: 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f  >5, 73->4.  Or o
43f0: 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20  ne of 719 other 
4400: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67  combinations mig
4410: 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a  ht be used. It.*
4420: 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c  * does not reall
4430: 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20  y matter.  What 
4440: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20  is important is 
4450: 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72 73  that sparse curs
4460: 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c  or.** numbers al
4470: 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74  l get mapped int
4480: 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68  o bit numbers th
4490: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20  at begin with 0 
44a0: 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  and contain.** n
44b0: 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63  o gaps..*/.struc
44c0: 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b  t WhereMaskSet {
44d0: 0a 20 20 69 6e 74 20 62 56 61 72 53 65 6c 65 63  .  int bVarSelec
44e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
44f0: 20 2f 2a 20 55 73 65 64 20 62 79 20 73 71 6c 69   /* Used by sqli
4500: 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
4510: 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  e() */.  int n; 
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
4550: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
4560: 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20  int ix[BMS];    
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4580: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
4590: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
45a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  };../*.** Initia
45b0: 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b  lize a WhereMask
45c0: 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64  Set object.*/.#d
45d0: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
45e0: 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a  t(P)  (P)->n=0..
45f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
4600: 74 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  t is a convenien
4610: 63 65 20 77 72 61 70 70 65 72 20 68 6f 6c 64 69  ce wrapper holdi
4620: 6e 67 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ng all informati
4630: 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74 6f 20  on needed.** to 
4640: 63 6f 6e 73 74 72 75 63 74 20 57 68 65 72 65 4c  construct WhereL
4650: 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
4660: 61 20 70 61 72 74 69 63 75 6c 61 72 20 71 75 65  a particular que
4670: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  ry..*/.struct Wh
4680: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 7b  ereLoopBuilder {
4690: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
46a0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  Info;        /* 
46b0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
46c0: 74 20 74 68 69 73 20 57 48 45 52 45 20 2a 2f 0a  t this WHERE */.
46d0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
46e0: 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  WC;         /* W
46f0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4700: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
4710: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
4720: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61   /* ORDER BY cla
4730: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
4740: 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
4750: 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
4760: 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 57 68  hereLoop */.  Wh
4770: 65 72 65 4f 72 53 65 74 20 2a 70 4f 72 53 65 74  ereOrSet *pOrSet
4780: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72  ;       /* Recor
4790: 64 20 62 65 73 74 20 6c 6f 6f 70 73 20 68 65 72  d best loops her
47a0: 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  e, if not NULL *
47b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
47c0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
47d0: 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b 65 64  STAT4.  Unpacked
47e0: 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20 20 20  Record *pRec;   
47f0: 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72 20 73    /* Probe for s
4800: 74 61 74 34 20 28 69 66 20 72 65 71 75 69 72 65  tat4 (if require
4810: 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  d) */.  int nRec
4820: 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  Valid;          
4830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
4840: 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75 72 72  alid fields curr
4850: 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20 2a 2f  ently in pRec */
4860: 0a 23 65 6e 64 69 66 0a 20 20 75 6e 73 69 67 6e  .#endif.  unsign
4870: 65 64 20 69 6e 74 20 62 6c 64 46 6c 61 67 73 3b  ed int bldFlags;
4880: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 4c      /* SQLITE_BL
4890: 44 46 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  DF_* flags */.  
48a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 50 6c  unsigned int iPl
48b0: 61 6e 4c 69 6d 69 74 3b 20 20 2f 2a 20 53 65 61  anLimit;  /* Sea
48c0: 72 63 68 20 6c 69 6d 69 74 65 72 20 2a 2f 0a 7d  rch limiter */.}
48d0: 3b 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61  ;../* Allowed va
48e0: 6c 75 65 73 20 66 6f 72 20 57 68 65 72 65 4c 6f  lues for WhereLo
48f0: 6f 70 42 75 69 64 65 72 2e 62 6c 64 46 6c 61 67  opBuider.bldFlag
4900: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s */.#define SQL
4910: 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44  ITE_BLDF_INDEXED
4920: 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 41 6e    0x0001   /* An
4930: 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 2a   index is used *
4940: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
4950: 5f 42 4c 44 46 5f 55 4e 49 51 55 45 20 20 20 30  _BLDF_UNIQUE   0
4960: 78 30 30 30 32 20 20 20 2f 2a 20 41 6c 6c 20 6b  x0002   /* All k
4970: 65 79 73 20 6f 66 20 61 20 55 4e 49 51 55 45 20  eys of a UNIQUE 
4980: 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 0a 2f  index used */../
4990: 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 42  * The WhereLoopB
49a0: 75 69 6c 64 65 72 2e 69 50 6c 61 6e 4c 69 6d 69  uilder.iPlanLimi
49b0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69 6d  t is used to lim
49c0: 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  it the number of
49d0: 0a 2a 2a 20 69 6e 64 65 78 2b 63 6f 6e 73 74 72  .** index+constr
49e0: 61 69 6e 74 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  aint combination
49f0: 73 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  s the query plan
4a00: 6e 65 72 20 77 69 6c 6c 20 63 6f 6e 73 69 64 65  ner will conside
4a10: 72 20 66 6f 72 20 61 0a 2a 2a 20 70 61 72 74 69  r for a.** parti
4a20: 63 75 6c 61 72 20 71 75 65 72 79 2e 20 20 49 66  cular query.  If
4a30: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
4a40: 69 73 20 75 6e 6c 69 6d 69 74 65 64 2c 20 74 68  is unlimited, th
4a50: 65 6e 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 61  en certain.** pa
4a60: 74 68 6f 6c 6f 67 69 63 61 6c 20 71 75 65 72 69  thological queri
4a70: 65 73 20 63 61 6e 20 73 70 65 6e 64 20 65 78 63  es can spend exc
4a80: 65 73 73 20 74 69 6d 65 20 69 6e 20 74 68 65 20  ess time in the 
4a90: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
4aa0: 6e 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  n().** routine. 
4ab0: 20 54 68 65 20 6c 69 6d 69 74 20 69 73 20 68 69   The limit is hi
4ac0: 67 68 20 65 6e 6f 75 67 68 20 74 68 61 74 20 69  gh enough that i
4ad0: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6d 70  s should not imp
4ae0: 61 63 74 20 72 65 61 6c 2d 77 6f 72 6c 64 0a 2a  act real-world.*
4af0: 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  * queries..**.**
4b00: 20 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c   SQLITE_QUERY_PL
4b10: 41 4e 4e 45 52 5f 4c 49 4d 49 54 20 69 73 20 74  ANNER_LIMIT is t
4b20: 68 65 20 62 61 73 65 6c 69 6e 65 20 6c 69 6d 69  he baseline limi
4b30: 74 2e 20 20 54 68 65 20 6c 69 6d 69 74 20 69 73  t.  The limit is
4b40: 0a 2a 2a 20 69 6e 63 72 65 61 73 65 64 20 62 79  .** increased by
4b50: 20 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c   SQLITE_QUERY_PL
4b60: 41 4e 4e 45 52 5f 4c 49 4d 49 54 5f 49 4e 43 52  ANNER_LIMIT_INCR
4b70: 20 62 65 66 6f 72 65 20 65 61 63 68 20 74 65 72   before each ter
4b80: 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 0a 2a 2a  m of the FROM.**
4b90: 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 63 65   clause is proce
4ba0: 73 73 65 64 2c 20 73 6f 20 74 68 61 74 20 65 76  ssed, so that ev
4bb0: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 61 20 6a  ery table in a j
4bc0: 6f 69 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  oin is guarantee
4bd0: 64 20 74 6f 20 62 65 0a 2a 2a 20 61 62 6c 65 20  d to be.** able 
4be0: 74 6f 20 70 72 6f 70 6f 73 65 20 61 20 73 6f 6d  to propose a som
4bf0: 65 20 69 6e 64 65 78 2b 63 6f 6e 73 74 72 61 69  e index+constrai
4c00: 6e 74 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  nt combinations 
4c10: 65 76 65 6e 20 69 66 20 74 68 65 20 69 6e 69 74  even if the init
4c20: 69 61 6c 0a 2a 2a 20 62 61 73 65 6c 69 6e 65 20  ial.** baseline 
4c30: 6c 69 6d 69 74 20 77 61 73 20 65 78 68 61 75 73  limit was exhaus
4c40: 74 65 64 20 62 79 20 70 72 69 6f 72 20 74 61 62  ted by prior tab
4c50: 6c 65 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  les of the join.
4c60: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
4c70: 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52  TE_QUERY_PLANNER
4c80: 5f 4c 49 4d 49 54 0a 23 20 64 65 66 69 6e 65 20  _LIMIT.# define 
4c90: 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41  SQLITE_QUERY_PLA
4ca0: 4e 4e 45 52 5f 4c 49 4d 49 54 20 32 30 30 30 30  NNER_LIMIT 20000
4cb0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
4cc0: 53 51 4c 49 54 45 5f 51 55 45 52 59 5f 50 4c 41  SQLITE_QUERY_PLA
4cd0: 4e 4e 45 52 5f 4c 49 4d 49 54 5f 49 4e 43 52 0a  NNER_LIMIT_INCR.
4ce0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
4cf0: 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49  QUERY_PLANNER_LI
4d00: 4d 49 54 5f 49 4e 43 52 20 31 30 30 30 0a 23 65  MIT_INCR 1000.#e
4d10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4d20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
4d30: 63 65 73 73 69 6e 67 20 72 6f 75 74 69 6e 65 20  cessing routine 
4d40: 68 61 73 20 74 77 6f 20 68 61 6c 76 65 73 2e 20  has two halves. 
4d50: 20 54 68 65 0a 2a 2a 20 66 69 72 73 74 20 70 61   The.** first pa
4d60: 72 74 20 64 6f 65 73 20 74 68 65 20 73 74 61 72  rt does the star
4d70: 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  t of the WHERE l
4d80: 6f 6f 70 20 61 6e 64 20 74 68 65 20 73 65 63 6f  oop and the seco
4d90: 6e 64 0a 2a 2a 20 68 61 6c 66 20 64 6f 65 73 20  nd.** half does 
4da0: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
4db0: 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 41 6e 20  WHERE loop.  An 
4dc0: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
4dd0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
4de0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4df0: 20 66 69 72 73 74 20 68 61 6c 66 20 61 6e 64 20   first half and 
4e00: 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f 20 74  passed.** into t
4e10: 68 65 20 73 65 63 6f 6e 64 20 68 61 6c 66 20 74  he second half t
4e20: 6f 20 67 69 76 65 20 73 6f 6d 65 20 63 6f 6e 74  o give some cont
4e30: 69 6e 75 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  inuity..**.** An
4e40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
4e50: 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 74  s object holds t
4e60: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 74 61 74  he complete stat
4e70: 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 0a 2a  e of the query.*
4e80: 2a 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  * planner..*/.st
4e90: 72 75 63 74 20 57 68 65 72 65 49 6e 66 6f 20 7b  ruct WhereInfo {
4ea0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4ec0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4ed0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4ee0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
4ef0: 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
4f00: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
4f10: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
4f20: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4f30: 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
4f40: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
4f50: 63 6c 61 75 73 65 20 6f 72 20 4e 55 4c 4c 20 2a  clause or NULL *
4f60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
4f70: 65 73 75 6c 74 53 65 74 3b 20 20 20 20 20 2f 2a  esultSet;     /*
4f80: 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
4f90: 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  he query */.  Ex
4fa0: 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
4fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
4fc0: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
4fd0: 61 75 73 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ause */.  LogEst
4fe0: 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20   iLimit;        
4ff0: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 69 66 20      /* LIMIT if 
5000: 77 63 74 72 6c 46 6c 61 67 73 20 68 61 73 20 57  wctrlFlags has W
5010: 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
5020: 2f 0a 20 20 69 6e 74 20 61 69 43 75 72 4f 6e 65  /.  int aiCurOne
5030: 50 61 73 73 5b 32 5d 3b 20 20 20 20 20 20 2f 2a  Pass[2];      /*
5040: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75   OP_OpenWrite cu
5050: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 4f 4e  rsors for the ON
5060: 45 50 41 53 53 20 6f 70 74 20 2a 2f 0a 20 20 69  EPASS opt */.  i
5070: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20  nt iContinue;   
5080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5090: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
50a0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f  e with next reco
50b0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  rd */.  int iBre
50c0: 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ak;             
50d0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
50e0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
50f0: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
5100: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
5110: 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65  ;      /* pParse
5120: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74  ->nQueryLoop out
5130: 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20 6c  side the WHERE l
5140: 6f 6f 70 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  oop */.  u16 wct
5150: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
5160: 20 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67     /* Flags orig
5170: 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f  inally passed to
5180: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
5190: 69 6e 28 29 20 2a 2f 0a 20 20 75 38 20 6e 4c 65  in() */.  u8 nLe
51a0: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
51b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
51c0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a   nested loop */.
51d0: 20 20 69 38 20 6e 4f 42 53 61 74 3b 20 20 20 20    i8 nOBSat;    
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
51f0: 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
5200: 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
5210: 64 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a  d by indices */.
5220: 20 20 75 38 20 73 6f 72 74 65 64 3b 20 20 20 20    u8 sorted;    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5240: 72 75 65 20 69 66 20 72 65 61 6c 6c 79 20 73 6f  rue if really so
5250: 72 74 65 64 20 28 6e 6f 74 20 6a 75 73 74 20 67  rted (not just g
5260: 72 6f 75 70 65 64 29 20 2a 2f 0a 20 20 75 38 20  rouped) */.  u8 
5270: 65 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20  eOnePass;       
5280: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53         /* ONEPAS
5290: 53 5f 4f 46 46 2c 20 6f 72 20 5f 53 49 4e 47 4c  S_OFF, or _SINGL
52a0: 45 2c 20 6f 72 20 5f 4d 55 4c 54 49 20 2a 2f 0a  E, or _MULTI */.
52b0: 20 20 75 38 20 75 6e 74 65 73 74 65 64 54 65 72    u8 untestedTer
52c0: 6d 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ms;         /* N
52d0: 6f 74 20 61 6c 6c 20 57 48 45 52 45 20 74 65 72  ot all WHERE ter
52e0: 6d 73 20 72 65 73 6f 6c 76 65 64 20 62 79 20 6f  ms resolved by o
52f0: 75 74 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75  uter loop */.  u
5300: 38 20 65 44 69 73 74 69 6e 63 74 3b 20 20 20 20  8 eDistinct;    
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
5320: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
5330: 54 49 4e 43 54 5f 2a 20 76 61 6c 75 65 73 20 2a  TINCT_* values *
5340: 2f 0a 20 20 75 38 20 62 4f 72 64 65 72 65 64 49  /.  u8 bOrderedI
5350: 6e 6e 65 72 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a  nnerLoop;     /*
5360: 20 54 72 75 65 20 69 66 20 6f 6e 6c 79 20 74 68   True if only th
5370: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  e inner-most loo
5380: 70 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  p is ordered */.
5390: 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20 20 20    int iTop;     
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
53b0: 68 65 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e  he very beginnin
53c0: 67 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  g of the WHERE l
53d0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  oop */.  WhereLo
53e0: 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20  op *pLoops;     
53f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
5400: 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
5410: 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  cts */.  Bitmask
5420: 20 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20   revMask;       
5430: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
5440: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
5450: 74 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67  t need reversing
5460: 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
5470: 77 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  wOut;           
5480: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
5490: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
54a0: 77 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ws */.  WhereCla
54b0: 75 73 65 20 73 57 43 3b 20 20 20 20 20 20 20 20  use sWC;        
54c0: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
54d0: 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
54e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
54f0: 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65  eMaskSet sMaskSe
5500: 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72  t;    /* Map cur
5510: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
5520: 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65  itmasks */.  Whe
5530: 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20 20  reLevel a[1];   
5540: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
5550: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
5560: 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48   nest loop in WH
5570: 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ERE */.};../*.**
5580: 20 50 72 69 76 61 74 65 20 69 6e 74 65 72 66 61   Private interfa
5590: 63 65 73 20 2d 20 63 61 6c 6c 61 62 6c 65 20 6f  ces - callable o
55a0: 6e 6c 79 20 62 79 20 6f 74 68 65 72 20 77 68 65  nly by other whe
55b0: 72 65 2e 63 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  re.c routines..*
55c0: 2a 0a 2a 2a 20 77 68 65 72 65 2e 63 3a 0a 2a 2f  *.** where.c:.*/
55d0: 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33  .Bitmask sqlite3
55e0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68 65  WhereGetMask(Whe
55f0: 72 65 4d 61 73 6b 53 65 74 2a 2c 69 6e 74 29 3b  reMaskSet*,int);
5600: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
5610: 43 45 5f 45 4e 41 42 4c 45 44 0a 76 6f 69 64 20  CE_ENABLED.void 
5620: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
5630: 73 65 50 72 69 6e 74 28 57 68 65 72 65 43 6c 61  sePrint(WhereCla
5640: 75 73 65 20 2a 70 57 43 29 3b 0a 23 65 6e 64 69  use *pWC);.#endi
5650: 66 0a 57 68 65 72 65 54 65 72 6d 20 2a 73 71 6c  f.WhereTerm *sql
5660: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
5670: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
5680: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
5690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
56a0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
56b0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
56c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
56d0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
56e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
56f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
5700: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
5710: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
5720: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
5730: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
5740: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
5750: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
5760: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5770: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
5780: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
5790: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
57a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
57b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
57c0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
57d0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
57e0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 3b  f not NULL */.);
57f0: 0a 0a 2f 2a 20 77 68 65 72 65 63 6f 64 65 2e 63  ../* wherecode.c
5800: 3a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  : */.#ifndef SQL
5810: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5820: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
5830: 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28  eExplainOneScan(
5840: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5860: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
5870: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
5880: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
5890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
58a0: 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
58b0: 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
58c0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
58d0: 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
58e0: 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
58f0: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
5900: 64 65 20 66 6f 72 20 2a 2f 0a 20 20 75 31 36 20  de for */.  u16 
5910: 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5930: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
5940: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
5950: 28 29 20 2a 2f 0a 29 3b 0a 23 65 6c 73 65 0a 23  () */.);.#else.#
5960: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 57   define sqlite3W
5970: 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
5980: 61 6e 28 75 2c 76 2c 77 2c 78 29 20 30 0a 23 65  an(u,v,w,x) 0.#e
5990: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
59a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 23  MIT_EXPLAIN */.#
59b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
59c0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
59d0: 54 55 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  TUS.void sqlite3
59e0: 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74  WhereAddScanStat
59f0: 75 73 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  us(.  Vdbe *v,  
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
5a20: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 20   add scanstatus 
5a30: 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72  entry to */.  Sr
5a40: 63 4c 69 73 74 20 2a 70 53 72 63 6c 69 73 74 2c  cList *pSrclist,
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76   FROM clause pLv
5a70: 6c 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f  l reads data fro
5a80: 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  m */.  WhereLeve
5a90: 6c 20 2a 70 4c 76 6c 2c 20 20 20 20 20 20 20 20  l *pLvl,        
5aa0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
5ab0: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
5ac0: 73 28 29 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f  s() entry for */
5ad0: 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61  .  int addrExpla
5ae0: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
5af0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5b00: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20   OP_Explain (or 
5b10: 30 29 20 2a 2f 0a 29 3b 0a 23 65 6c 73 65 0a 23  0) */.);.#else.#
5b20: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 57   define sqlite3W
5b30: 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
5b40: 73 28 61 2c 20 62 2c 20 63 2c 20 64 29 20 28 28  s(a, b, c, d) ((
5b50: 76 6f 69 64 29 64 29 0a 23 65 6e 64 69 66 0a 42  void)d).#endif.B
5b60: 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68  itmask sqlite3Wh
5b70: 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
5b80: 61 72 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  art(.  Parse *pP
5b90: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
5ba0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5bb0: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
5bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
5bd0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
5be0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5bf0: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  n */.  WhereInfo
5c00: 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
5c10: 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
5c20: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
5c30: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
5c40: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
5c50: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
5c60: 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
5c70: 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
5c80: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
5c90: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 2f 2a 20  el *pLevel,  /* 
5ca0: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  The current leve
5cb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 42  l pointer */.  B
5cc0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
5cd0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
5ce0: 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
5cf0: 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
5d00: 3b 0a 0a 2f 2a 20 77 68 65 72 65 65 78 70 72 2e  ;../* whereexpr.
5d10: 63 3a 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  c: */.void sqlit
5d20: 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
5d30: 74 28 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 57  t(WhereClause*,W
5d40: 68 65 72 65 49 6e 66 6f 2a 29 3b 0a 76 6f 69 64  hereInfo*);.void
5d50: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
5d60: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
5d70: 61 75 73 65 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  ause*);.void sql
5d80: 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 57  ite3WhereSplit(W
5d90: 68 65 72 65 43 6c 61 75 73 65 2a 2c 45 78 70 72  hereClause*,Expr
5da0: 2a 2c 75 38 29 3b 0a 42 69 74 6d 61 73 6b 20 73  *,u8);.Bitmask s
5db0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
5dc0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
5dd0: 74 2a 2c 20 45 78 70 72 2a 29 3b 0a 42 69 74 6d  t*, Expr*);.Bitm
5de0: 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65  ask sqlite3Where
5df0: 45 78 70 72 55 73 61 67 65 4e 4e 28 57 68 65 72  ExprUsageNN(Wher
5e00: 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 2a  eMaskSet*, Expr*
5e10: 29 3b 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  );.Bitmask sqlit
5e20: 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
5e30: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
5e40: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
5e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
5e60: 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63  eExprAnalyze(Src
5e70: 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75  List*, WhereClau
5e80: 73 65 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  se*);.void sqlit
5e90: 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72  e3WhereTabFuncAr
5ea0: 67 73 28 50 61 72 73 65 2a 2c 20 73 74 72 75 63  gs(Parse*, struc
5eb0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
5ec0: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a   WhereClause*);.
5ed0: 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61  ...../*.** Bitma
5ee0: 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72  sks for the oper
5ef0: 61 74 6f 72 73 20 6f 6e 20 57 68 65 72 65 54 65  ators on WhereTe
5f00: 72 6d 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65  rm objects.  The
5f10: 73 65 20 61 72 65 20 61 6c 6c 0a 2a 2a 20 6f 70  se are all.** op
5f20: 65 72 61 74 6f 72 73 20 74 68 61 74 20 61 72 65  erators that are
5f30: 20 6f 66 20 69 6e 74 65 72 65 73 74 20 74 6f 20   of interest to 
5f40: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
5f50: 72 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20  r.  An.** OR-ed 
5f60: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
5f70: 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20  hese values can 
5f80: 62 65 20 75 73 65 64 20 77 68 65 6e 20 73 65 61  be used when sea
5f90: 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 70 61  rching for.** pa
5fa0: 72 74 69 63 75 6c 61 72 20 57 68 65 72 65 54 65  rticular WhereTe
5fb0: 72 6d 73 20 77 69 74 68 69 6e 20 61 20 57 68 65  rms within a Whe
5fc0: 72 65 43 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  reClause..**.** 
5fd0: 56 61 6c 75 65 20 63 6f 6e 73 74 72 61 69 6e 74  Value constraint
5fe0: 73 3a 0a 2a 2a 20 20 20 20 20 57 4f 5f 45 51 20  s:.**     WO_EQ 
5ff0: 20 20 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 44     == SQLITE_IND
6000: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
6010: 0a 2a 2a 20 20 20 20 20 57 4f 5f 4c 54 20 20 20  .**     WO_LT   
6020: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58   == SQLITE_INDEX
6030: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 0a 2a  _CONSTRAINT_LT.*
6040: 2a 20 20 20 20 20 57 4f 5f 4c 45 20 20 20 20 3d  *     WO_LE    =
6050: 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  = SQLITE_INDEX_C
6060: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 0a 2a 2a 20  ONSTRAINT_LE.** 
6070: 20 20 20 20 57 4f 5f 47 54 20 20 20 20 3d 3d 20      WO_GT    == 
6080: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
6090: 53 54 52 41 49 4e 54 5f 47 54 0a 2a 2a 20 20 20  STRAINT_GT.**   
60a0: 20 20 57 4f 5f 47 45 20 20 20 20 3d 3d 20 53 51    WO_GE    == SQ
60b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
60c0: 52 41 49 4e 54 5f 47 45 0a 2a 2f 0a 23 64 65 66  RAINT_GE.*/.#def
60d0: 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 30 78  ine WO_IN     0x
60e0: 30 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f  0001.#define WO_
60f0: 45 51 20 20 20 20 20 30 78 30 30 30 32 0a 23 64  EQ     0x0002.#d
6100: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
6110: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
6120: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
6130: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
6140: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
6150: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
6160: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
6170: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
6180: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
6190: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
61a0: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 55 58  ).#define WO_AUX
61b0: 20 20 20 20 30 78 30 30 34 30 20 20 20 20 20 20      0x0040      
61c0: 20 2f 2a 20 4f 70 20 75 73 65 66 75 6c 20 74 6f   /* Op useful to
61d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
61e0: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
61f0: 57 4f 5f 49 53 20 20 20 20 20 30 78 30 30 38 30  WO_IS     0x0080
6200: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
6210: 4c 4c 20 30 78 30 31 30 30 0a 23 64 65 66 69 6e  LL 0x0100.#defin
6220: 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 30 32  e WO_OR     0x02
6230: 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20  00       /* Two 
6240: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
6250: 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64  cted terms */.#d
6260: 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20  efine WO_AND    
6270: 30 78 30 34 30 30 20 20 20 20 20 20 20 2f 2a 20  0x0400       /* 
6280: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
6290: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
62a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51  */.#define WO_EQ
62b0: 55 49 56 20 20 30 78 30 38 30 30 20 20 20 20 20  UIV  0x0800     
62c0: 20 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d    /* Of the form
62d0: 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75   A==B, both colu
62e0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  mns */.#define W
62f0: 4f 5f 4e 4f 4f 50 20 20 20 30 78 31 30 30 30 20  O_NOOP   0x1000 
6300: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
6310: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74  rm does not rest
6320: 72 69 63 74 20 73 65 61 72 63 68 20 73 70 61 63  rict search spac
6330: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f  e */..#define WO
6340: 5f 41 4c 4c 20 20 20 20 30 78 31 66 66 66 20 20  _ALL    0x1fff  
6350: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
6360: 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f  all possible WO_
6370: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  * values */.#def
6380: 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78  ine WO_SINGLE 0x
6390: 30 31 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61  01ff       /* Ma
63a0: 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f  sk of all non-co
63b0: 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75  mpound WO_* valu
63c0: 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  es */../*.** The
63d0: 73 65 20 61 72 65 20 64 65 66 69 6e 69 74 69 6f  se are definitio
63e0: 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
63f0: 65 20 57 68 65 72 65 4c 6f 6f 70 2e 77 73 46 6c  e WhereLoop.wsFl
6400: 61 67 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 54 68  ags field..** Th
6410: 65 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  e particular com
6420: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 62 69 74 73  bination of bits
6430: 20 69 6e 20 65 61 63 68 20 57 68 65 72 65 4c 6f   in each WhereLo
6440: 6f 70 20 68 65 6c 70 20 74 6f 0a 2a 2a 20 64 65  op help to.** de
6450: 74 65 72 6d 69 6e 65 20 74 68 65 20 61 6c 67 6f  termine the algo
6460: 72 69 74 68 6d 20 74 68 61 74 20 57 68 65 72 65  rithm that Where
6470: 4c 6f 6f 70 20 72 65 70 72 65 73 65 6e 74 73 2e  Loop represents.
6480: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
6490: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30  E_COLUMN_EQ    0
64a0: 78 30 30 30 30 30 30 30 31 20 20 2f 2a 20 78 3d  x00000001  /* x=
64b0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
64c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
64d0: 47 45 20 30 78 30 30 30 30 30 30 30 32 20 20 2f  GE 0x00000002  /
64e0: 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  * x<EXPR and/or 
64f0: 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x>EXPR */.#defin
6500: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  e WHERE_COLUMN_I
6510: 4e 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20  N    0x00000004 
6520: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
6530: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
6540: 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30  COLUMN_NULL  0x0
6550: 30 30 30 30 30 30 38 20 20 2f 2a 20 78 20 49 53  0000008  /* x IS
6560: 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65   NULL */.#define
6570: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
6580: 54 20 20 20 30 78 30 30 30 30 30 30 30 66 20 20  T   0x0000000f  
6590: 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65 20 57 48  /* Any of the WH
65a0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78 78 20 76  ERE_COLUMN_xxx v
65b0: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
65c0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
65d0: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 20      0x00000010  
65e0: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d  /* x<EXPR or x<=
65f0: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
6600: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
6610: 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78  _BTM_LIMIT    0x
6620: 30 30 30 30 30 30 32 30 20 20 2f 2a 20 78 3e 45  00000020  /* x>E
6630: 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63  XPR or x>=EXPR c
6640: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
6650: 66 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f  fine WHERE_BOTH_
6660: 4c 49 4d 49 54 20 20 20 30 78 30 30 30 30 30 30  LIMIT   0x000000
6670: 33 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58  30  /* Both x>EX
6680: 50 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f  PR and x<EXPR */
6690: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
66a0: 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30  DX_ONLY     0x00
66b0: 30 30 30 30 34 30 20 20 2f 2a 20 55 73 65 20 69  000040  /* Use i
66c0: 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74  ndex only - omit
66d0: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
66e0: 65 20 57 48 45 52 45 5f 49 50 4b 20 20 20 20 20  e WHERE_IPK     
66f0: 20 20 20 20 20 30 78 30 30 30 30 30 31 30 30 20       0x00000100 
6700: 20 2f 2a 20 78 20 69 73 20 74 68 65 20 49 4e 54   /* x is the INT
6710: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6720: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
6730: 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30  E_INDEXED      0
6740: 78 30 30 30 30 30 32 30 30 20 20 2f 2a 20 57 68  x00000200  /* Wh
6750: 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72 65 65 2e  ereLoop.u.btree.
6760: 70 49 6e 64 65 78 20 69 73 20 76 61 6c 69 64 20  pIndex is valid 
6770: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
6780: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
6790: 30 30 30 30 30 34 30 30 20 20 2f 2a 20 57 68 65  00000400  /* Whe
67a0: 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62 20 69 73  reLoop.u.vtab is
67b0: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
67c0: 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  e WHERE_IN_ABLE 
67d0: 20 20 20 20 20 30 78 30 30 30 30 30 38 30 30 20       0x00000800 
67e0: 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70   /* Able to supp
67f0: 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  ort an IN operat
6800: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  or */.#define WH
6810: 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20 20 20 20  ERE_ONEROW      
6820: 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20   0x00001000  /* 
6830: 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20  Selects no more 
6840: 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a  than one row */.
6850: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55  #define WHERE_MU
6860: 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 30 30 30  LTI_OR     0x000
6870: 30 32 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69  02000  /* OR usi
6880: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69  ng multiple indi
6890: 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ces */.#define W
68a0: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20  HERE_AUTO_INDEX 
68b0: 20 20 30 78 30 30 30 30 34 30 30 30 20 20 2f 2a    0x00004000  /*
68c0: 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72   Uses an ephemer
68d0: 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66  al index */.#def
68e0: 69 6e 65 20 57 48 45 52 45 5f 53 4b 49 50 53 43  ine WHERE_SKIPSC
68f0: 41 4e 20 20 20 20 20 30 78 30 30 30 30 38 30 30  AN     0x0000800
6900: 30 20 20 2f 2a 20 55 73 65 73 20 74 68 65 20 73  0  /* Uses the s
6910: 6b 69 70 2d 73 63 61 6e 20 61 6c 67 6f 72 69 74  kip-scan algorit
6920: 68 6d 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  hm */.#define WH
6930: 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 20 20  ERE_UNQ_WANTED  
6940: 20 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20   0x00010000  /* 
6950: 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 77 6f 75  WHERE_ONEROW wou
6960: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 68 65 6c  ld have been hel
6970: 70 66 75 6c 2a 2f 0a 23 64 65 66 69 6e 65 20 57  pful*/.#define W
6980: 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20  HERE_PARTIALIDX 
6990: 20 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a    0x00020000  /*
69a0: 20 54 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   The automatic i
69b0: 6e 64 65 78 20 69 73 20 70 61 72 74 69 61 6c 20  ndex is partial 
69c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
69d0: 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20 20 30 78  _IN_EARLYOUT  0x
69e0: 30 30 30 34 30 30 30 30 20 20 2f 2a 20 50 65 72  00040000  /* Per
69f0: 68 61 70 73 20 71 75 69 74 20 49 4e 20 6c 6f 6f  haps quit IN loo
6a00: 70 73 20 65 61 72 6c 79 20 2a 2f 0a              ps early */.