/ Hex Artifact Content
Login

Artifact 1e19c96cf8a55310118130ce251511be72e766f7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 39 36   where.c,v 1.196
0340: 20 32 30 30 36 2f 30 31 2f 31 33 20 31 33 3a 30   2006/01/13 13:0
0350: 31 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:19 danielk1977
0360: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0370: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
0390: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 61 20  er of bits in a 
03a0: 42 69 74 6d 61 73 6b 2e 20 20 22 42 4d 53 22 20  Bitmask.  "BMS" 
03b0: 6d 65 61 6e 73 20 22 42 69 74 4d 61 73 6b 20 53  means "BitMask S
03c0: 69 7a 65 22 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ize"..*/.#define
03d0: 20 42 4d 53 20 20 28 73 69 7a 65 6f 66 28 42 69   BMS  (sizeof(Bi
03e0: 74 6d 61 73 6b 29 2a 38 29 0a 0a 2f 2a 0a 2a 2a  tmask)*8)../*.**
03f0: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
0400: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
0410: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 2e 0a 2a  s in an array..*
0420: 2f 0a 23 64 65 66 69 6e 65 20 41 52 52 41 59 53  /.#define ARRAYS
0430: 49 5a 45 28 58 29 20 20 28 73 69 7a 65 6f 66 28  IZE(X)  (sizeof(
0440: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
0450: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0460: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0470: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0480: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0490: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
04a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 65  .int sqlite3_whe
04b0: 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23 20  re_trace = 0;.# 
04c0: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 20  define TRACE(X) 
04d0: 20 69 66 28 73 71 6c 69 74 65 33 5f 77 68 65 72   if(sqlite3_wher
04e0: 65 5f 74 72 61 63 65 29 20 73 71 6c 69 74 65 33  e_trace) sqlite3
04f0: 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65  DebugPrintf X.#e
0500: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41  lse.# define TRA
0510: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0520: 0a 2a 2a 20 41 20 6c 61 72 67 65 20 76 61 6c 75  .** A large valu
0530: 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6d  e which is the m
0540: 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 75  aximum cost of u
0550: 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  sing an index..*
0560: 2a 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69  * By default thi
0570: 73 20 69 73 20 61 20 6c 61 72 67 65 20 66 6c 6f  s is a large flo
0580: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
0590: 65 2e 20 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69  e.  When compili
05a0: 6e 67 0a 2a 2a 20 53 51 4c 69 74 65 20 66 6f 72  ng.** SQLite for
05b0: 20 61 20 70 72 6f 63 65 73 73 6f 72 20 74 68 61   a processor tha
05c0: 74 20 6c 61 63 6b 73 20 66 6c 6f 61 74 69 6e 67  t lacks floating
05d0: 20 70 6f 69 6e 74 20 73 75 70 70 6f 72 74 2c 20   point support, 
05e0: 73 69 6d 70 6c 79 0a 2a 2a 20 72 65 64 65 66 69  simply.** redefi
05f0: 6e 65 20 74 68 69 73 20 63 6f 6e 73 74 61 6e 74  ne this constant
0600: 20 74 6f 20 61 20 6c 61 72 67 65 20 69 6e 74 65   to a large inte
0610: 67 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ger..*/.#ifndef 
0620: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 0a 23  SQLITE_BIG_DBL.#
0630: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
0640: 49 47 5f 44 42 4c 20 28 31 2e 30 65 2b 39 39 29  IG_DBL (1.0e+99)
0650: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
0660: 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f  ard reference.*/
0670: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0680: 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72  WhereClause Wher
0690: 65 43 6c 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20  eClause;../*.** 
06a0: 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72 61  The query genera
06b0: 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72 61  tor uses an arra
06c0: 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  y of instances o
06d0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
06e0: 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61   to.** help it a
06f0: 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65 78  nalyze the subex
0700: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
0710: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
0720: 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c  Each WHERE.** cl
0730: 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73 69  ause subexpressi
0740: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
0750: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
0760: 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
0770: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68  or..**.** All Wh
0780: 65 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c  ereTerms are col
0790: 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69  lected into a si
07a0: 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65  ngle WhereClause
07b0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a   structure.  .**
07c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
07d0: 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a  dentity holds:.*
07e0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72  *.**        Wher
07f0: 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65  eTerm.pWC->a[Whe
0800: 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57  reTerm.idx] == W
0810: 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57  hereTerm.**.** W
0820: 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66  hen a term is of
0830: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20                X 
0850: 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a  <op> <expr>.**.*
0860: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63  * where X is a c
0870: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c  olumn name and <
0880: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65  op> is one of ce
0890: 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c  rtain operators,
08a0: 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65  .** then WhereTe
08b0: 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e  rm.leftCursor an
08c0: 64 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74  d WhereTerm.left
08d0: 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68  Column record th
08e0: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62  e.** cursor numb
08f0: 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75  er and column nu
0900: 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65  mber for X.  Whe
0910: 72 65 54 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20  reTerm.operator 
0920: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c  records.** the <
0930: 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d  op> using a bitm
0940: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66  ask encoding def
0950: 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62  ined by WO_xxx b
0960: 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73  elow.  The.** us
0970: 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65  e of a bitmask e
0980: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
0990: 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20  operator allows 
09a0: 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20  us to search.** 
09b0: 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d  quickly for term
09c0: 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
09d0: 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66   of several diff
09e0: 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e  erent operators.
09f0: 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 52 69 67  .**.** prereqRig
0a00: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0a10: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0a20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0a30: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0a40: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0a50: 20 73 69 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b   single ExprMask
0a60: 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74 72  Set structure tr
0a70: 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73  anslates.** curs
0a80: 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62  or number into b
0a90: 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e  its and the tran
0aa0: 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73 74  slated bit is st
0ab0: 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65 72  ored in the prer
0ac0: 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54  eq.** fields.  T
0ad0: 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  he translation i
0ae0: 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20  s used in order 
0af0: 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20  to maximize the 
0b00: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74  number of.** bit
0b10: 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  s that will fit 
0b20: 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54  in a Bitmask.  T
0b30: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
0b40: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a  umbers might be.
0b50: 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76  ** spread out ov
0b60: 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74  er the non-negat
0b70: 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46  ive integers.  F
0b80: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
0b90: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
0ba0: 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c  s might be 3, 8,
0bb0: 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20   9, 10, 20, 23, 
0bc0: 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65  41, and 45.  The
0bd0: 20 45 78 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20   ExprMaskSet.** 
0be0: 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65  translates these
0bf0: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
0c00: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
0c10: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
0c20: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  .** beginning wi
0c30: 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f  th 0 in order to
0c40: 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70   make the best p
0c50: 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74  ossible use of t
0c60: 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  he available.** 
0c70: 62 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d  bits in the Bitm
0c80: 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65  ask.  So, in the
0c90: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
0ca0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
0cb0: 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d  rs.** would be m
0cc0: 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67  apped into integ
0cd0: 65 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e  ers 0 through 7.
0ce0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0cf0: 63 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65  ct WhereTerm Whe
0d00: 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74 20 57  reTerm;.struct W
0d10: 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70  hereTerm {.  Exp
0d20: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
0d30: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0d40: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
0d50: 73 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50  sion */.  i16 iP
0d60: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
0d70: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43    /* Disable pWC
0d80: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65  ->a[iParent] whe
0d90: 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61  n this term disa
0da0: 62 6c 65 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65  bled */.  i16 le
0db0: 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  ftCursor;       
0dc0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0dd0: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
0de0: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
0df0: 69 31 36 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20  i16 leftColumn; 
0e00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
0e10: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  n number of X in
0e20: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
0e30: 20 2a 2f 0a 20 20 75 31 36 20 6f 70 65 72 61 74   */.  u16 operat
0e40: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  or;           /*
0e50: 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64   A WO_xx value d
0e60: 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a  escribing <op> *
0e70: 2f 0a 20 20 75 38 20 66 6c 61 67 73 3b 20 20 20  /.  u8 flags;   
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0e90: 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62  it flags.  See b
0ea0: 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68  elow */.  u8 nCh
0eb0: 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
0ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0ed0: 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73  hildren that mus
0ee0: 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a  t disable us */.
0ef0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
0f00: 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC;       /* The
0f10: 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72   clause this ter
0f20: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a  m is part of */.
0f30: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
0f40: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74  Right;    /* Bit
0f50: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75  mask of tables u
0f60: 73 65 64 20 62 79 20 70 52 69 67 68 74 20 2a 2f  sed by pRight */
0f70: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
0f80: 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69  qAll;      /* Bi
0f90: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
0fa0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 20  referenced by p 
0fb0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  */.};../*.** All
0fc0: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57  owed values of W
0fd0: 68 65 72 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a  hereTerm.flags.*
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
0ff0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
1000: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
1010: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1020: 74 65 28 70 45 78 70 72 29 20 2a 2f 0a 23 64 65  te(pExpr) */.#de
1030: 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55 41  fine TERM_VIRTUA
1040: 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 41  L    0x02   /* A
1050: 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  dded by the opti
1060: 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63  mizer.  Do not c
1070: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ode */.#define T
1080: 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20 30  ERM_CODED      0
1090: 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74 65  x04   /* This te
10a0: 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  rm is already co
10b0: 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ded */.#define T
10c0: 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20 30  ERM_COPIED     0
10d0: 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20 63  x08   /* Has a c
10e0: 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hild */.#define 
10f0: 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20  TERM_OR_OK      
1100: 30 78 31 30 20 20 20 2f 2a 20 55 73 65 64 20 64  0x10   /* Used d
1110: 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  uring OR-clause 
1120: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f  processing */../
1130: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1140: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1150: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
1160: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
1170: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45  n about a.** WHE
1180: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74  RE clause.  Most
1190: 6c 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  ly this is a con
11a0: 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f  tainer for one o
11b0: 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d  r more WhereTerm
11c0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
11d0: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
11e0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
11f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1200: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1210: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
1220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1230: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  ber of terms */.
1240: 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
1250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1260: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1270: 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  in a[] */.  Wher
1280: 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20  eTerm *a;       
1290: 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d       /* Each a[]
12a0: 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65 72   describes a ter
12b0: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
12c0: 6c 75 61 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  luase */.  Where
12d0: 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 30 5d  Term aStatic[10]
12e0: 3b 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73  ;   /* Initial s
12f0: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
1300: 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  a[] */.};../*.**
1310: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1320: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1330: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1340: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1350: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1360: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1370: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1380: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1390: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
13a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
13b0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
13c0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
13d0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
13e0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
13f0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1400: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1410: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1420: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1430: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1440: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1450: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1460: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1470: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1480: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1490: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
14a0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
14b0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
14c0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
14d0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
14e0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
14f0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1500: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1510: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1520: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1530: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1540: 2a 2a 0a 2a 2a 20 49 66 20 45 78 70 72 4d 61 73  **.** If ExprMas
1550: 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74  kSet.ix[A]==B it
1560: 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65 20   means that The 
1570: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42 69  A-th bit of a Bi
1580: 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  tmask.** corresp
1590: 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f 72  onds VDBE cursor
15a0: 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20   number B.  The 
15b0: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62 69  A-th bit of a bi
15c0: 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a  tmask is 1<<A..*
15d0: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
15e0: 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  , if the WHERE c
15f0: 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
1600: 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42 45   used these VDBE
1610: 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c  .** cursors:  4,
1620: 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37   5, 8, 29, 57, 7
1630: 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 45 78  3.  Then the  Ex
1640: 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  prMaskSet struct
1650: 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70  ure.** would map
1660: 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75   those cursor nu
1670: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20  mbers into bits 
1680: 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a  0 through 5..**.
1690: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
16a0: 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20   mapping is not 
16b0: 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65  necessarily orde
16c0: 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61  red.  In the exa
16d0: 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  mple.** above, t
16e0: 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74  he mapping might
16f0: 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20   go like this:  
1700: 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32  4->3, 5->1, 8->2
1710: 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e  , 29->0,.** 57->
1720: 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e  5, 73->4.  Or on
1730: 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63  e of 719 other c
1740: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68  ombinations migh
1750: 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a  t be used. It.**
1760: 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79   does not really
1770: 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69   matter.  What i
1780: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74  s important is t
1790: 68 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f  hat sparse curso
17a0: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c  r.** numbers all
17b0: 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   get mapped into
17c0: 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61   bit numbers tha
17d0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
17e0: 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f  nd contain.** no
17f0: 20 67 61 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65   gaps..*/.typede
1800: 66 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  f struct ExprMas
1810: 6b 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74  kSet ExprMaskSet
1820: 3b 0a 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  ;.struct ExprMas
1830: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  int n; 
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1860: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
1870: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
1880: 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66 28 42 69  int ix[sizeof(Bi
1890: 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a  tmask)*8];    /*
18a0: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
18b0: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
18c0: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61  };.../*.** Bitma
18d0: 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72  sks for the oper
18e0: 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63  ators that indic
18f0: 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65  es are able to e
1900: 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f  xploit.  An.** O
1910: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
1920: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
1930: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
1940: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
1950: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
1960: 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f  where clause..*/
1970: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20  .#define WO_IN  
1980: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f     1.#define WO_
1990: 45 51 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65  EQ     2.#define
19a0: 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45   WO_LT     (WO_E
19b0: 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29  Q<<(TK_LT-TK_EQ)
19c0: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20  ).#define WO_LE 
19d0: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
19e0: 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LE-TK_EQ)).#defi
19f0: 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f  ne WO_GT     (WO
1a00: 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45  _EQ<<(TK_GT-TK_E
1a10: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
1a20: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
1a30: 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a  K_GE-TK_EQ))../*
1a40: 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 66 6c  .** Value for fl
1a50: 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
1a60: 62 65 73 74 49 6e 64 65 78 28 29 0a 2a 2f 0a 23  bestIndex().*/.#
1a70: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
1a80: 49 44 5f 45 51 20 20 20 20 20 20 20 30 78 30 30  ID_EQ       0x00
1a90: 30 31 20 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  01   /* rowid=EX
1aa0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
1ab0: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
1ac0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1ad0: 45 20 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a  E    0x0002   /*
1ae0: 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64 2f   rowid<EXPR and/
1af0: 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f  or rowid>EXPR */
1b00: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
1b10: 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 20 20 30 78  OLUMN_EQ      0x
1b20: 30 30 31 30 20 20 20 2f 2a 20 78 3d 45 58 50 52  0010   /* x=EXPR
1b30: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   or x IN (...) *
1b40: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1b50: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 20 20 30  COLUMN_RANGE   0
1b60: 78 30 30 32 30 20 20 20 2f 2a 20 78 3c 45 58 50  x0020   /* x<EXP
1b70: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
1b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1b90: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 20 20  _COLUMN_IN      
1ba0: 30 78 30 30 34 30 20 20 20 2f 2a 20 78 20 49 4e  0x0040   /* x IN
1bb0: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1bc0: 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  e WHERE_TOP_LIMI
1bd0: 54 20 20 20 20 20 20 30 78 30 31 30 30 20 20 20  T      0x0100   
1be0: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d  /* x<EXPR or x<=
1bf0: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
1c00: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1c10: 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 20 20  _BTM_LIMIT      
1c20: 30 78 30 32 30 30 20 20 20 2f 2a 20 78 3e 45 58  0x0200   /* x>EX
1c30: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
1c40: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
1c50: 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ine WHERE_IDX_ON
1c60: 4c 59 20 20 20 20 20 20 20 30 78 30 38 30 30 20  LY       0x0800 
1c70: 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f    /* Use index o
1c80: 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65  nly - omit table
1c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1ca0: 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 20  E_ORDERBY       
1cb0: 20 30 78 31 30 30 30 20 20 20 2f 2a 20 4f 75 74   0x1000   /* Out
1cc0: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
1cd0: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
1ce0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1cf0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 20  E_REVERSE       
1d00: 20 30 78 32 30 30 30 20 20 20 2f 2a 20 53 63 61   0x2000   /* Sca
1d10: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1d20: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1d30: 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20  ERE_UNIQUE      
1d40: 20 20 20 30 78 34 30 30 30 20 20 20 2f 2a 20 53     0x4000   /* S
1d50: 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74  elects no more t
1d60: 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a  han one row */..
1d70: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1d80: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
1d90: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
1da0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1db0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1dc0: 65 49 6e 69 74 28 57 68 65 72 65 43 6c 61 75 73  eInit(WhereClaus
1dd0: 65 20 2a 70 57 43 2c 20 50 61 72 73 65 20 2a 70  e *pWC, Parse *p
1de0: 50 61 72 73 65 29 7b 0a 20 20 70 57 43 2d 3e 70  Parse){.  pWC->p
1df0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1e00: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
1e10: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
1e20: 20 41 52 52 41 59 53 49 5a 45 28 70 57 43 2d 3e   ARRAYSIZE(pWC->
1e30: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
1e40: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
1e50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  c;.}../*.** Deal
1e60: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
1e70: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
1e80: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
1e90: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
1ea0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
1eb0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1ec0: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
1ed0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
1ee0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
1ef0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1f00: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
1f10: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
1f20: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
1f30: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
1f40: 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61  Term-1, a=pWC->a
1f50: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b  ; i>=0; i--, a++
1f60: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 66 6c  ){.    if( a->fl
1f70: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
1f80: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
1f90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 61 2d  te3ExprDelete(a-
1fa0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1fb0: 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21   }.  if( pWC->a!
1fc0: 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b  =pWC->aStatic ){
1fd0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1fe0: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1ff0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
2000: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 57  entries to the W
2010: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
2020: 74 75 72 65 2e 20 20 49 6e 63 72 65 61 73 65 20  ture.  Increase 
2030: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  the allocated.**
2040: 20 73 70 61 63 65 20 61 73 20 6e 65 63 65 73 73   space as necess
2050: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ary..**.** WARNI
2060: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
2070: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
2080: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
2090: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
20a0: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
20b0: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
20c0: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
20d0: 69 6e 76 61 6c 69 64 65 64 20 61 66 74 65 72 0a  invalided after.
20e0: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
20f0: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
2100: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
2110: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
2120: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
2130: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
2140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2150: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
2160: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
2170: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  pWC, Expr *p, in
2180: 74 20 66 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  t flags){.  Wher
2190: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
21a0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70  int idx;.  if( p
21b0: 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e  WC->nTerm>=pWC->
21c0: 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65  nSlot ){.    Whe
21d0: 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70  reTerm *pOld = p
21e0: 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e  WC->a;.    pWC->
21f0: 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  a = sqliteMalloc
2200: 28 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  ( sizeof(pWC->a[
2210: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
2220: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
2230: 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  >a==0 ) return 0
2240: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43  ;.    memcpy(pWC
2250: 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f  ->a, pOld, sizeo
2260: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
2270: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  ->nTerm);.    if
2280: 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74  ( pOld!=pWC->aSt
2290: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71  atic ){.      sq
22a0: 6c 69 74 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a  liteFree(pOld);.
22b0: 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e      }.    pWC->n
22c0: 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20  Slot *= 2;.  }. 
22d0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
22e0: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
22f0: 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d  m];.  pWC->nTerm
2300: 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78  ++;.  pTerm->pEx
2310: 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d  pr = p;.  pTerm-
2320: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2330: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
2340: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
2350: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
2360: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
2370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2380: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
2390: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
23a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
23b0: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
23c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
23d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
23e0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
23f0: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
2400: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
2410: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
2420: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
2430: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2440: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
2450: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
2460: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
2470: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
2480: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
2490: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
24a0: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
24b0: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
24c0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
24d0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
24e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
24f0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
2500: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
2510: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
2520: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
2540: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
2550: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
2560: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
2570: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
2580: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
2590: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
25a0: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
25b0: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
25c0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
25d0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
25e0: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
25f0: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
2600: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
2610: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
2620: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
2630: 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72 61  rray.  This arra
2640: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
2650: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
2660: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2670: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
2680: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2690: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
26a0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
26b0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
26c0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
26d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
26e0: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
26f0: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2700: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
2710: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2720: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2730: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
2740: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
2750: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2760: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
2770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
2780: 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73  ialize an expres
2790: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f  sion mask set.*/
27a0: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
27b0: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
27c0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
27d0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
27e0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
27f0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
2800: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
2810: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
2820: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
2830: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
2840: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78  tmask getMask(Ex
2850: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
2860: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2870: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2880: 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65  r(i=0; i<pMaskSe
2890: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
28a0: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  if( pMaskSet->ix
28b0: 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  [i]==iCursor ){.
28c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42        return ((B
28d0: 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  itmask)1)<<i;.  
28e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2900: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
2910: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
2920: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
2930: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
2940: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
2950: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
2960: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
2970: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2980: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
2990: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
29a0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
29b0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
29c0: 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20  routine.  So we 
29d0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
29e0: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
29f0: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
2a00: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
2a10: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
2a20: 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74  Mask(ExprMaskSet
2a30: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2a40: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
2a50: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
2a60: 3c 20 41 52 52 41 59 53 49 5a 45 28 70 4d 61 73  < ARRAYSIZE(pMas
2a70: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
2a80: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
2a90: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
2aa0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
2ab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
2ac0: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
2ad0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2ae0: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
2af0: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
2b00: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
2b10: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
2b20: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
2b30: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
2b40: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
2b50: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
2b60: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
2b70: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
2b80: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
2b90: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
2ba0: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
2bb0: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
2bc0: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
2bd0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2be0: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
2bf0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2c00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
2c10: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52  The sqlite3ExprR
2c20: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f  esolveNames() ro
2c30: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
2c40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
2c50: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
2c60: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
2c70: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
2c80: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
2c90: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
2ca0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
2cb0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
2cc0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
2cd0: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
2ce0: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
2cf0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
2d00: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
2d10: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
2d20: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
2d30: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2d40: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2d50: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
2d60: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2d70: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2d80: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2d90: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c  ge(ExprMaskSet*,
2da0: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2db0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2dc0: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
2dd0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2de0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d  Expr *p){.  Bitm
2df0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
2e00: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2e10: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  n 0;.  if( p->op
2e20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
2e30: 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73     mask = getMas
2e40: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
2e50: 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75  Table);.    retu
2e60: 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d  rn mask;.  }.  m
2e70: 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ask = exprTableU
2e80: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2e90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73  ->pRight);.  mas
2ea0: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
2eb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
2ec0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20  >pLeft);.  mask 
2ed0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2ee0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2ef0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73  p->pList);.  mas
2f00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2f10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2f20: 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b  et, p->pSelect);
2f30: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2f40: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2f50: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2f60: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2f70: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
2f80: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
2f90: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
2fa0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
2fb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2fc0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
2fd0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2fe0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2ff0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3000: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
3010: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
3020: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
3030: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
3040: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
3050: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
3060: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
3070: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
3080: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20  ask mask;.  if( 
3090: 70 53 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73  pS==0 ){.    mas
30a0: 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 0;.  }else{.
30b0: 20 20 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c      mask = exprL
30c0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
30d0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
30e0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
30f0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
3100: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
3110: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
3120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
3130: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
3140: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
3150: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
3160: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
3170: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
3180: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
3190: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
31a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
31b0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  pHaving);.  }.  
31c0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
31e0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
31f0: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
3200: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
3210: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
3220: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
3230: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
3240: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
3250: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
3260: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
3270: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
3280: 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61  and "IN"..*/.sta
3290: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f  tic int allowedO
32a0: 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73  p(int op){.  ass
32b0: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
32c0: 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20   && TK_GT<TK_GE 
32d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
32e0: 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LT>TK_EQ && TK_L
32f0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
3300: 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51  ert( TK_LE>TK_EQ
3310: 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20   && TK_LE<TK_GE 
3320: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
3330: 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20  GE==TK_EQ+4 );. 
3340: 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49   return op==TK_I
3350: 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20  N || (op>=TK_EQ 
3360: 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d  && op<=TK_GE);.}
3370: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
3380: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
3390: 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53   T..*/.#define S
33a0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
33b0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
33c0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
33d0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e  te a comparision
33e0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72   operator.  Expr
33f0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
3400: 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20  orm "X op Y".** 
3410: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
3420: 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a  to "Y op X"..*/.
3430: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3440: 43 6f 6d 6d 75 74 65 28 45 78 70 72 20 2a 70 45  Commute(Expr *pE
3450: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
3460: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
3470: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
3480: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57  p!=TK_IN );.  SW
3490: 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70  AP(CollSeq*,pExp
34a0: 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  r->pRight->pColl
34b0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70  ,pExpr->pLeft->p
34c0: 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50 28 45 78  Coll);.  SWAP(Ex
34d0: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
34e0: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
34f0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3500: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3510: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3520: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3530: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3540: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3550: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3560: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3570: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
3580: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3590: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
35a0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
35b0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
35c0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
35d0: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
35e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
35f0: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3600: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3610: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3620: 61 74 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f  atic int operato
3630: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3640: 20 69 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74   int c;.  assert
3650: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3660: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
3670: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
3680: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _IN;.  }else{.  
3690: 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70    c = WO_EQ<<(op
36a0: 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61  -TK_EQ);.  }.  a
36b0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e  ssert( op!=TK_IN
36c0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a   || c==WO_IN );.
36d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
36e0: 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20  _EQ || c==WO_EQ 
36f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3700: 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LT || c==WO_
3710: 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LT );.  assert( 
3720: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d  op!=TK_LE || c==
3730: 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72  WO_LE );.  asser
3740: 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  t( op!=TK_GT || 
3750: 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73  c==WO_GT );.  as
3760: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20  sert( op!=TK_GE 
3770: 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  || c==WO_GE );. 
3780: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
3790: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
37a0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
37b0: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
37c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
37d0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
37e0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
37f0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
3800: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
3810: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
3820: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
3830: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
3840: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
3850: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
3860: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
3870: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
3880: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
3890: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
38a0: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
38b0: 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  *findTerm(.  Whe
38c0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
38d0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
38e0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
38f0: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3900: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3910: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3920: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3930: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3940: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3950: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3960: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
3970: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
3980: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
3990: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
39a0: 0a 20 20 75 31 36 20 6f 70 2c 20 20 20 20 20 20  .  u16 op,      
39b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
39c0: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
39d0: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
39e0: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
39f0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3a00: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3a10: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3a20: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3a30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3a40: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
3a50: 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72  nt k;.  for(pTer
3a60: 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
3a70: 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20  >nTerm; k; k--, 
3a80: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
3a90: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
3aa0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
3ab0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
3ac0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3ad0: 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
3ae0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75   pTerm->leftColu
3af0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
3b00: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 6f 70     && (pTerm->op
3b10: 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a  erator & op)!=0.
3b20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
3b30: 20 69 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78   iCur>=0 && pIdx
3b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
3b50: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
3b60: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  xpr;.        Col
3b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
3b80: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
3b90: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
3ba0: 0a 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a  .        Parse *
3bb0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
3bc0: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  arse;..        i
3bd0: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3be0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3bf0: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3c00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3c10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3c20: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
3c30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3c40: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3c50: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
3c60: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b  rse, pX->pLeft);
3c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
3c80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
3c90: 20 69 66 28 20 70 58 2d 3e 70 52 69 67 68 74 20   if( pX->pRight 
3ca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
3cb0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
3cc0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3cd0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
3ce0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3cf0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
3d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
3d10: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
3d20: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
3d30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
3d50: 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
3d60: 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61 69  lumn && pIdx->ai
3d70: 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 69 43 6f 6c 75  Column[k]!=iColu
3d80: 6d 6e 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20  mn; k++){}.     
3d90: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 70 49 64     assert( k<pId
3da0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
3db0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3dc0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
3dd0: 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
3de0: 6f 6c 6c 5b 6b 5d 29 20 29 20 63 6f 6e 74 69 6e  oll[k]) ) contin
3df0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3e00: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3e10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3e20: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3e30: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
3e50: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
3e60: 2a 2c 20 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c  *, ExprMaskSet*,
3e70: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
3e80: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
3e90: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
3ea0: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
3eb0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
3ec0: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
3ed0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
3ee0: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
3ef0: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
3f00: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
3f10: 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  e */.  ExprMaskS
3f20: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20  et *pMaskSet,   
3f30: 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a  /* table masks *
3f40: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3f50: 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20  *pWC         /* 
3f60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3f70: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
3f80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
3f90: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
3fa0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
3fb0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
3fc0: 28 70 54 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b  (pTabList, pMask
3fd0: 53 65 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  Set, pWC, i);.  
3fe0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
3ff0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
4000: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
4010: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
4020: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
4030: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
4040: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
4050: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
4060: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
4070: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
4080: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
4090: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
40a0: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
40b0: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
40c0: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
40d0: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
40e0: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
40f0: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
4100: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
4110: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
4120: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
4130: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4140: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
4150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
4160: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
4170: 61 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ase */.  Expr *p
4180: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
4190: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
41a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50  on */.  int *pnP
41b0: 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d  attern,   /* Num
41c0: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
41d0: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
41e0: 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  cters */.  int *
41f0: 70 69 73 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20  pisComplete  /* 
4200: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
4210: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
4220: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
4230: 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  cter */.){.  con
4240: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78  st char *z;.  Ex
4250: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
4260: 66 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ft;.  ExprList *
4270: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20  pList;.  int c, 
4280: 63 6e 74 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73  cnt;.  int noCas
4290: 65 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  e;.  char wc[3];
42a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
42b0: 6c 3b 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  l;..  if( !sqlit
42c0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
42d0: 28 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43  (db, pExpr, &noC
42e0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
42f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4300: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
4310: 4c 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20 3d  List;.  pRight =
4320: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
4330: 70 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74  pr;.  if( pRight
4340: 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
4350: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4360: 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70  .  }.  pLeft = p
4370: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
4380: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
4390: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
43a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
43b0: 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66  }.  pColl = pLef
43c0: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20  t->pColl;.  if( 
43d0: 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
43e0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
43f0: 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28  tColl;.  }.  if(
4400: 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53   (pColl->type!=S
4410: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
4420: 59 20 7c 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a  Y || noCase) &&.
4430: 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79        (pColl->ty
4440: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
4450: 4e 4f 43 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73  NOCASE || !noCas
4460: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
4470: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
4480: 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 52 69  3DequoteExpr(pRi
4490: 67 68 74 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61  ght);.  z = (cha
44a0: 72 20 2a 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r *)pRight->toke
44b0: 6e 2e 7a 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30  n.z;.  for(cnt=0
44c0: 3b 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ; (c=z[cnt])!=0 
44d0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
44e0: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
44f0: 5b 32 5d 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20  [2]; cnt++){}.  
4500: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
4510: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b  5==(u8)z[cnt] ){
4520: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4530: 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74   }.  *pisComplet
4540: 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30  e = z[cnt]==wc[0
4550: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
4560: 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d  ;.  *pnPattern =
4570: 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31   cnt;.  return 1
4580: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4590: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
45a0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
45b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61  /*.** If the pBa
45c0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
45d0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
45e0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
45f0: 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c  se of.** a join,
4600: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
4610: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
4620: 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20  arkings over to 
4630: 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  derived..*/.stat
4640: 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72  ic void transfer
4650: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70  JoinMarkings(Exp
4660: 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70  r *pDerived, Exp
4670: 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65  r *pBase){.  pDe
4680: 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20  rived->flags |= 
4690: 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45  pBase->flags & E
46a0: 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44  P_FromJoin;.  pD
46b0: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
46c0: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
46d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
46e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
46f0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
4700: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
4710: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
4720: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
4730: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
4740: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
4750: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
4760: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
4770: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
4780: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
4790: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
47a0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
47b0: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
47c0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
47d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
47e0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
47f0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
4800: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
4810: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
4820: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
4830: 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20 74  > <expr>".  If t
4840: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4850: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4860: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
4870: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
4880: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
4890: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
48a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
48b0: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
48c0: 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73  w virtual expres
48d0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  sion of the form
48e0: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20 69  .** "Y <op> X" i
48f0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57  s added to the W
4900: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
4910: 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74  analyzed separat
4920: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
4930: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
4940: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
4950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4960: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4970: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
4980: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f   *pMaskSet,    /
4990: 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f  * table masks */
49a0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
49b0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
49c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
49d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
49e0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
49f0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
4a00: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
4a10: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
4a20: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
4a30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
4a40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
4a50: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
4a60: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
4a70: 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70  eft;.  Bitmask p
4a80: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20  rereqAll;.  int 
4a90: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20  nPattern;.  int 
4aa0: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20 69  isComplete;..  i
4ab0: 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  f( sqlite3Thread
4ac0: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e  DataReadOnly()->
4ad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
4ae0: 65 74 75 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c  eturn;.  prereqL
4af0: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  eft = exprTableU
4b00: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4b10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4b20: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
4b30: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
4b40: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
4b50: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72  t==0 );.    pTer
4b60: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
4b70: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4b80: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
4b90: 78 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20  xpr->pList).    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 7c 20 65 78 70 72 53 65 6c 65        | exprSele
4bc0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
4bd0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 53  skSet, pExpr->pS
4be0: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  elect);.  }else{
4bf0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
4c00: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
4c10: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4c20: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
4c30: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
4c40: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
4c50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
4c60: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
4c70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
4c80: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
4c90: 29 7b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  ){.    prereqAll
4ca0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
4cb0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
4cc0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
4cd0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
4ce0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
4cf0: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
4d00: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
4d10: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
4d20: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 6f 70 65  -1;.  pTerm->ope
4d30: 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28  rator = 0;.  if(
4d40: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
4d50: 2d 3e 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  ->op) && (pTerm-
4d60: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
4d70: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
4d80: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
4d90: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
4da0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
4db0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
4dc0: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
4dd0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4de0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
4df0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
4e00: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
4e10: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c    pTerm->leftCol
4e20: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
4e30: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72  lumn;.      pTer
4e40: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20 6f 70  m->operator = op
4e50: 65 72 61 74 6f 72 4d 61 73 6b 28 70 45 78 70 72  eratorMask(pExpr
4e60: 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->op);.    }.   
4e70: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
4e80: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
4e90: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
4ea0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
4eb0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
4ec0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
4ed0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
4ee0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
4ef0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
4f00: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
4f10: 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20  rDup(pExpr);.   
4f20: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
4f30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
4f40: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
4f50: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
4f60: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
4f70: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
4f80: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
4f90: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
4fa0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
4fb0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
4fc0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
4fd0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
4fe0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
4ff0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
5000: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
5010: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
5020: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
5030: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
5040: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
5050: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
5060: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
5070: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75   exprCommute(pDu
5080: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
5090: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
50a0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
50b0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
50c0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
50d0: 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  w->leftColumn = 
50e0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
50f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
5100: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
5110: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
5120: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
5130: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
5140: 4e 65 77 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20  New->operator = 
5150: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
5160: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
5170: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5180: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
5190: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
51a0: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
51b0: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
51c0: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
51d0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
51e0: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
51f0: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
5200: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
5210: 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  lements..  */.  
5220: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
5230: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
5240: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
5250: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
5260: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
5270: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
5280: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
5290: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
52a0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
52b0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
52c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
52d0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
52e0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
52f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
5300: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
5310: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
5320: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
5330: 28 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33  (ops[i], sqlite3
5340: 45 78 70 72 44 75 70 28 70 45 78 70 72 2d 3e 70  ExprDup(pExpr->p
5350: 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20  Left),.         
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5380: 75 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  up(pList->a[i].p
5390: 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  Expr), 0);.     
53a0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
53b0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
53c0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
53d0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
53e0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70  AMIC);.      exp
53f0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
5400: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
5410: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
5420: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
5430: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
5440: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
5450: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
5460: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
5470: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
5480: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5490: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
54a0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
54b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54c0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
54d0: 4f 4e 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ON.  /* Attempt 
54e0: 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f  to convert OR-co
54f0: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e  nnected terms in
5500: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
5510: 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74  r so that.  ** t
5520: 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65  hey can make use
5530: 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 45 78   of indices.  Ex
5540: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5550: 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20        x = expr1 
5560: 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20   OR  expr2 = x  
5570: 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 20 20  OR  x = expr3.  
5580: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
5590: 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 0a 20  rted into.  **. 
55a0: 20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65   **      x IN (e
55b0: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
55c0: 29 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ).  */.  else if
55d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
55e0: 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  OR ){.    int ok
55f0: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
5600: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c      int iColumn,
5610: 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68   iCursor;.    Wh
5620: 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20  ereClause sOr;. 
5630: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
5640: 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65  rTerm;..    asse
5650: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
5660: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
5670: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72  )==0 );.    wher
5680: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72  eClauseInit(&sOr
5690: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 29 3b 0a  , pWC->pParse);.
56a0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26      whereSplit(&
56b0: 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  sOr, pExpr, TK_O
56c0: 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  R);.    exprAnal
56d0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4d 61  yzeAll(pSrc, pMa
56e0: 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a 20 20  skSet, &sOr);.  
56f0: 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54    assert( sOr.nT
5700: 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a 20 3d  erm>0 );.    j =
5710: 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
5720: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e    iColumn = sOr.
5730: 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  a[j].leftColumn;
5740: 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d  .      iCursor =
5750: 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75   sOr.a[j].leftCu
5760: 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d  rsor;.      ok =
5770: 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20   iCursor>=0;.   
5780: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
5790: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
57a0: 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b  r.a; i>=0 && ok;
57b0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
57c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
57d0: 72 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 21  rTerm->operator!
57e0: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
57f0: 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f      goto or_not_
5800: 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20  possible;.      
5810: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5820: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
5830: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26 26 20  sor==iCursor && 
5840: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c  pOrTerm->leftCol
5850: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
5860: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
5870: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
5880: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
5890: 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 72 54 65  }else if( (pOrTe
58a0: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
58b0: 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20  _COPIED)!=0 ||. 
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c     ((pOrTerm->fl
58e0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
58f0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5910: 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  sOr.a[pOrTerm->i
5920: 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20  Parent].flags & 
5930: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20  TERM_OR_OK)!=0) 
5940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
5950: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Term->flags &= ~
5960: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
5970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5980: 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20       ok = 0;.   
5990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
59a0: 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26     }while( !ok &
59b0: 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c  & (sOr.a[j++].fl
59c0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
59d0: 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e  D)!=0 && j<sOr.n
59e0: 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20  Term );.    if( 
59f0: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ok ){.      Expr
5a00: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
5a10: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
5a20: 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  w, *pDup;.      
5a30: 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d  for(i=sOr.nTerm-
5a40: 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61  1, pOrTerm=sOr.a
5a50: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d  ; i>=0 && ok; i-
5a60: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
5a70: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
5a80: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
5a90: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
5aa0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5ab0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
5ac0: 70 72 44 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70  prDup(pOrTerm->p
5ad0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
5ae0: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
5af0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5b00: 70 65 6e 64 28 70 4c 69 73 74 2c 20 70 44 75 70  pend(pList, pDup
5b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5b20: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
5b30: 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e  e3Expr(TK_COLUMN
5b40: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5b50: 20 20 69 66 28 20 70 44 75 70 20 29 7b 0a 20 20    if( pDup ){.  
5b60: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62        pDup->iTab
5b70: 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
5b80: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c        pDup->iCol
5b90: 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  umn = iColumn;. 
5ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
5bb0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
5bc0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
5bd0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
5be0: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
5bf0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
5c00: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
5c10: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
5c20: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
5c30: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
5c40: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
5c50: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
5c60: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  sert(pWC, pNew, 
5c70: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
5c80: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
5c90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
5ca0: 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20  pSrc, pMaskSet, 
5cb0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
5cc0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
5cd0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
5ce0: 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69          pWC->a[i
5cf0: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
5d00: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
5d10: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
5d20: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
5d30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5d40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5d50: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
5d60: 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73      }.or_not_pos
5d70: 73 69 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65  sible:.    where
5d80: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72  ClauseClear(&sOr
5d90: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
5da0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
5db0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5dc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5dd0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
5de0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
5df0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
5e00: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
5e10: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
5e20: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
5e30: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
5e40: 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  f( isLikeOrGlob(
5e50: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pWC->pParse->db,
5e60: 20 70 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72   pExpr, &nPatter
5e70: 6e 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 29 20  n, &isComplete) 
5e80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
5e90: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
5ea0: 20 45 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70   Expr *pStr1, *p
5eb0: 53 74 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a  Str2;.    Expr *
5ec0: 70 4e 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77  pNewExpr1, *pNew
5ed0: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
5ee0: 64 78 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b  dxNew1, idxNew2;
5ef0: 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
5f00: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
5f10: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67  .pExpr;.    pRig
5f20: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
5f30: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
5f40: 20 20 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74     pStr1 = sqlit
5f50: 65 33 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47  e3Expr(TK_STRING
5f60: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5f70: 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20  if( pStr1 ){.   
5f80: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
5f90: 6f 70 79 28 26 70 53 74 72 31 2d 3e 74 6f 6b 65  opy(&pStr1->toke
5fa0: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  n, &pRight->toke
5fb0: 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d  n);.      pStr1-
5fc0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74  >token.n = nPatt
5fd0: 65 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ern;.    }.    p
5fe0: 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  Str2 = sqlite3Ex
5ff0: 70 72 44 75 70 28 70 53 74 72 31 29 3b 0a 20 20  prDup(pStr1);.  
6000: 20 20 69 66 28 20 70 53 74 72 32 20 29 7b 0a 20    if( pStr2 ){. 
6010: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
6020: 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b  r2->token.dyn );
6030: 0a 20 20 20 20 20 20 2b 2b 2a 28 75 38 2a 29 26  .      ++*(u8*)&
6040: 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e  pStr2->token.z[n
6050: 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20  Pattern-1];.    
6060: 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  }.    pNewExpr1 
6070: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6080: 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _GE, sqlite3Expr
6090: 44 75 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72  Dup(pLeft), pStr
60a0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
60b0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
60c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
60d0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
60e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
60f0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
6100: 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ze(pSrc, pMaskSe
6110: 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  t, pWC, idxNew1)
6120: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
6130: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6140: 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _LT, sqlite3Expr
6150: 44 75 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72  Dup(pLeft), pStr
6160: 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  2, 0);.    idxNe
6170: 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w2 = whereClause
6180: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
6190: 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54  Expr2, TERM_VIRT
61a0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
61b0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
61c0: 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ze(pSrc, pMaskSe
61d0: 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  t, pWC, idxNew2)
61e0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
61f0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
6200: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
6210: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
6220: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
6230: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
6240: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
6250: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
6260: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
6270: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
6280: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6290: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
62a0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
62b0: 4f 4e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ON */.}.../*.** 
62c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63  This routine dec
62d0: 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ides if pIdx can
62e0: 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69   be used to sati
62f0: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
6300: 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20  .** clause.  If 
6310: 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72  it can, it retur
6320: 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63  ns 1.  If pIdx c
6330: 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  annot satisfy th
6340: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
6350: 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ause, this routi
6360: 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  ne returns 0..**
6370: 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
6380: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
6390: 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  se from a SELECT
63a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61   statement.  pTa
63b0: 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74  b is the.** left
63c0: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74  -most table in t
63d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
63e0: 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45  f that same SELE
63f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
6400: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61  .** the table ha
6410: 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
6420: 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49  r of "base".  pI
6430: 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
6440: 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45  n pTab..**.** nE
6450: 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  qCol is the numb
6460: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
6470: 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75   pIdx that are u
6480: 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a  sed as equality.
6490: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ** constraints. 
64a0: 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f   Any of these co
64b0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73  lumns may be mis
64c0: 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52  sing from the OR
64d0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
64e0: 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63   and the match c
64f0: 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75  an still be a su
6500: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ccess..**.** All
6510: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
6520: 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63  DER BY that matc
6530: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  h against the in
6540: 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68  dex must be eith
6550: 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53  er.** ASC or DES
6560: 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68  C.  (Terms of th
6570: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6580: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
6590: 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e  f a UNIQUE.** in
65a0: 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  dex do not need 
65b0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20  to satisfy this 
65c0: 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68  constraint.)  Th
65d0: 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69  e *pbRev value i
65e0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66  s.** set to 1 if
65f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
6600: 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43  ause is all DESC
6610: 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74   and it is set t
6620: 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52  o 0 if.** the OR
6630: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
6640: 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61   all ASC..*/.sta
6650: 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e  tic int isSortin
6660: 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  gIndex(.  Parse 
6670: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
6680: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
6690: 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
66a0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
66b0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
66c0: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f  e are testing */
66d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
66e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
66f0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f  e table to be so
6700: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61  rted */.  int ba
6710: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
6720: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
6730: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
6740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6750: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
6760: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6770: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c  */.  int nEqCol,
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6790: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
67a0: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
67b0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
67c0: 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20   int *pbRev     
67d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
67e0: 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59  to 1 if ORDER BY
67f0: 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20   is DESC */.){. 
6800: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6830: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
6840: 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rder = 0;       
6850: 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66         /* XOR of
6860: 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
6870: 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69   BY sort directi
6880: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  on */.  int nTer
6890: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
68a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
68b0: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
68c0: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
68d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
68e0: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65  Term;    /* A te
68f0: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
6900: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  BY clause */.  s
6910: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6920: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
6930: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
6940: 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  );.  nTerm = pOr
6950: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6960: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
6970: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
6980: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
6990: 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
69a0: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
69b0: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
69c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c   */.  for(i=j=0,
69d0: 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
69e0: 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69  >a; j<nTerm && i
69f0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
6a00: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
6a10: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
6a20: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
6a30: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
6a40: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
6a50: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
6a60: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
6a70: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
6a80: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
6a90: 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
6aa0: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
6ab0: 69 73 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  is term */..    
6ac0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
6ad0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
6ae0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
6af0: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
6b00: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
6b10: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
6b20: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
6b30: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
6b40: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
6b50: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
6b60: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
6b70: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
6b80: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  use */.      ret
6b90: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
6ba0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
6bb0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
6bc0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
6bd0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
6be0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
6bf0: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  ll;.    if( pExp
6c00: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78  r->iColumn!=pIdx
6c10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c  ->aiColumn[i] ||
6c20: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
6c30: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
6c40: 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
6c50: 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  oll[i]) ){.     
6c60: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
6c70: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6c80: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
6c90: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
6ca0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
6cb0: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6cd0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
6ce0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
6cf0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
6d00: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
6d10: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
6d20: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
6d30: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
6d40: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
6d50: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
6d60: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6d70: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
6d80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6d90: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
6da0: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
6db0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
6dc0: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
6dd0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
6de0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
6df0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
6e00: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
6e10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
6e20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
6e30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
6e40: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
6e50: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
6e60: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
6e70: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
6e80: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
6e90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
6ea0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6eb0: 5b 69 5d 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e  [i]==0 || pIdx->
6ec0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 31  aSortOrder[i]==1
6ed0: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
6ee0: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
6ef0: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 5e 20 70 54  ortOrder[i] ^ pT
6f00: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
6f10: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
6f20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65   ){.      if( te
6f30: 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72  rmSortOrder!=sor
6f40: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
6f50: 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e    /* Indices can
6f60: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
6f70: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
6f80: 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  rms past the.   
6f90: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
6fa0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
6fb0: 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43   all either DESC
6fc0: 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20   or ASC. */.    
6fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6fe0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6ff0: 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
7000: 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
7020: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
7030: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
7040: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
7050: 72 20 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c  r sorting if all
7060: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
7070: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
7080: 2a 2a 20 61 72 65 20 63 6f 76 65 72 65 64 2e 0a  ** are covered..
7090: 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54    */.  if( j>=nT
70a0: 65 72 6d 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  erm ){.    *pbRe
70b0: 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30  v = sortOrder!=0
70c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
70d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
70e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
70f0: 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74  able to see if t
7100: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7110: 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63  se in pOrderBy c
7120: 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a  an be satisfied.
7130: 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e  ** by sorting in
7140: 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e   order of ROWID.
7150: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
7160: 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52   so and set *pbR
7170: 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65  ev to be.** true
7180: 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57   for reverse ROW
7190: 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  ID and false for
71a0: 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f   forward ROWID o
71b0: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
71c0: 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  int sortableByRo
71d0: 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c  wid(.  int base,
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71f0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
7200: 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20  for table to be 
7210: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
7220: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
7230: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
7240: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
7250: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
7260: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
7270: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
7280: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
7290: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
72a0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
72b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
72c0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
72d0: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
72e0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
72f0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
7300: 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 6f 70 3d  xpr==1 && p->op=
7310: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
7320: 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 0a 20 20  >iTable==base.  
7330: 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 69 43          && p->iC
7340: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20  olumn==-1 ){.   
7350: 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72   *pbRev = pOrder
7360: 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
7370: 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  er;.    return 1
7380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
73a0: 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d  re a crude estim
73b0: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72  ate of the logar
73c0: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
73d0: 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  t value..** The 
73e0: 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74  results need not
73f0: 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73   be exact.  This
7400: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
7410: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20  r estimating.** 
7420: 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f  the total cost o
7430: 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65  f performing ope
7440: 72 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c  ratings with O(l
7450: 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29  ogN) or O(NlogN)
7460: 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20  .** complexity. 
7470: 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75   Because N is ju
7480: 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69  st a guess, it i
7490: 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65  s no great trage
74a0: 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73  dy if.** logN is
74b0: 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a   a little off..*
74c0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
74d0: 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29  estLog(double N)
74e0: 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20  {.  double logN 
74f0: 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20  = 1;.  double x 
7500: 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e  = 10;.  while( N
7510: 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b  >x ){.    logN +
7520: 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  = 1;.    x *= 10
7530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
7540: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ogN;.}../*.** Fi
7550: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  nd the best inde
7560: 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  x for accessing 
7570: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
7580: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
7590: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
75a0: 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61  index, flags tha
75b0: 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74  t describe how t
75c0: 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
75d0: 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20  be used, the.** 
75e0: 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
75f0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
7600: 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66  and the "cost" f
7610: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a  or this index..*
7620: 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
7630: 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e  cost index wins.
7640: 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
7650: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
7660: 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
7670: 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
7680: 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
7690: 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
76a0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
76b0: 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  dex..** Factors 
76c0: 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
76d0: 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
76e0: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
76f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
7700: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
7710: 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
7720: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
7730: 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
7740: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
7750: 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
7760: 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
7770: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
7780: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
7790: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
77a0: 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
77b0: 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
77c0: 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
77d0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  able..**.*/.stat
77e0: 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e  ic double bestIn
77f0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
7800: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
7810: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
7820: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
7830: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7850: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7860: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7870: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
7880: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7890: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
78a0: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
78b0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
78c0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
78d0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
78e0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
78f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7900: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
7910: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
7920: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
7930: 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20  **ppIndex,      
7940: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70        /* Make *p
7950: 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20  pIndex point to 
7960: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a  the best index *
7970: 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  /.  int *pFlags,
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73  /* Put flags des
79a0: 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f  cribing this cho
79b0: 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a  ice in *pFlags *
79c0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20  /.  int *pnEq   
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65  /* Put the numbe
79f0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
7a00: 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a  nstraints here *
7a10: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
7a20: 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78   *pTerm;.  Index
7a30: 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20   *bestIdx = 0;  
7a40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
7a50: 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c  that gives the l
7a60: 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20  owest cost */.  
7a70: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
7a80: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
7a90: 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
7aa0: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
7ab0: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
7ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7ad0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
7ae0: 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20  th bestIdx */.  
7af0: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7b10: 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45  est value for nE
7b20: 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  q */.  int iCur 
7b30: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
7b40: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
7b50: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
7b60: 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
7b70: 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b90: 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
7ba0: 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
7bb0: 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bd0: 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
7be0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
7bf0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c10: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
7c20: 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a  ed with pProbe *
7c30: 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  /.  int nEq;    
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
7c60: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7c70: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
7c80: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
7c90: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
7ca0: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
7cb0: 20 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64   TRACE(("bestInd
7cc0: 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65  ex: tbl=%s notRe
7cd0: 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d  ady=%x\n", pSrc-
7ce0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f  >pTab->zName, no
7cf0: 74 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65  tReady));.  lowe
7d00: 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  stCost = SQLITE_
7d10: 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 43  BIG_DBL;..  /* C
7d20: 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64  heck for a rowid
7d30: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
7d40: 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69  N (...) constrai
7d50: 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  nts.  */.  pTerm
7d60: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
7d70: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
7d80: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
7d90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
7da0: 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  m ){.    Expr *p
7db0: 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64  Expr;.    *ppInd
7dc0: 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74  ex = 0;.    best
7dd0: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  Flags = WHERE_RO
7de0: 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20  WID_EQ;.    if( 
7df0: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
7e00: 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  & WO_EQ ){.     
7e10: 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61   /* Rowid== is a
7e20: 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70  lways the best p
7e30: 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75  ick.  Look no fu
7e40: 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20  rther.  Because 
7e50: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20  only.      ** a 
7e60: 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65  single row is ge
7e70: 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20  nerated, output 
7e80: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72  is always in sor
7e90: 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
7ea0: 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45     *pFlags = WHE
7eb0: 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48  RE_ROWID_EQ | WH
7ec0: 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
7ed0: 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20    *pnEq = 1;.   
7ee0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62     TRACE(("... b
7ef0: 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29  est is rowid\n")
7f00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7f10: 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0.0;.    }else i
7f20: 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65 72  f( (pExpr = pTer
7f30: 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74  m->pExpr)->pList
7f40: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
7f50: 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a  Rowid IN (LIST):
7f60: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
7f70: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
7f80: 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20  mber of list.   
7f90: 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20     ** elements. 
7fa0: 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74   */.      lowest
7fb0: 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Cost = pExpr->pL
7fc0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
7fd0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20    lowestCost *= 
7fe0: 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73  estLog(lowestCos
7ff0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8000: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e       /* Rowid IN
8010: 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20   (SELECT): cost 
8020: 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e  is NlogN where N
8030: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
8040: 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
8050: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  in the result of
8060: 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63   the inner selec
8070: 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77  t.  We have no w
8080: 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20  ay to estimate. 
8090: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c       ** that val
80a0: 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c  ue so make a wil
80b0: 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20  d guess. */.    
80c0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32    lowestCost = 2
80d0: 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  00;.    }.    TR
80e0: 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
80f0: 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  IN cost: %.9g\n"
8100: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a  , lowestCost));.
8110: 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61    }..  /* Estima
8120: 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  te the cost of a
8130: 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66   table scan.  If
8140: 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
8150: 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e  how many.  ** en
8160: 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65  tries are in the
8170: 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69   table, use 1 mi
8180: 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73  llion as a guess
8190: 2e 0a 20 20 2a 2f 0a 20 20 70 50 72 6f 62 65 20  ..  */.  pProbe 
81a0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
81b0: 6e 64 65 78 3b 0a 20 20 63 6f 73 74 20 3d 20 70  ndex;.  cost = p
81c0: 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e  Probe ? pProbe->
81d0: 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30  aiRowEst[0] : 10
81e0: 30 30 30 30 30 3b 0a 20 20 54 52 41 43 45 28 28  00000;.  TRACE((
81f0: 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20  "... table scan 
8200: 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c  base cost: %.9g\
8210: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c  n", cost));.  fl
8220: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
8230: 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43  D_RANGE;..  /* C
8240: 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61  heck for constra
8250: 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20  ints on a range 
8260: 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74  of rowids in a t
8270: 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a  able scan..  */.
8280: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
8290: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
82a0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
82b0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
82c0: 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _GE, 0);.  if( p
82d0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
82e0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
82f0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
8300: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
8310: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
8320: 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
8330: 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  MIT;.      cost 
8340: 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20  /= 3;  /* Guess 
8350: 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20  that rowid<EXPR 
8360: 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74  eliminates two-t
8370: 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f  hirds or rows */
8380: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
8390: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
83a0: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
83b0: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
83c0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
83d0: 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  |= WHERE_BTM_LIM
83e0: 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f  IT;.      cost /
83f0: 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  = 3;  /* Guess t
8400: 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65  hat rowid>EXPR e
8410: 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
8420: 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  irds of rows */.
8430: 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
8440: 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67  ("... rowid rang
8450: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
8460: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
8470: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8480: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a  flags = 0;.  }..
8490: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
84a0: 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20  e scan does not 
84b0: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
84c0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63  R BY clause, inc
84d0: 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63  rease.  ** the c
84e0: 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20  ost by NlogN to 
84f0: 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e 73  cover the expens
8500: 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f  e of sorting. */
8510: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
8520: 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61  ){.    if( sorta
8530: 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
8540: 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29   pOrderBy, &rev)
8550: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
8560: 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
8570: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
8580: 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  GE;.      if( re
8590: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  v ){.        fla
85a0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
85b0: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
85c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
85d0: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
85e0: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54  g(cost);.      T
85f0: 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
8600: 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  ng increases cos
8610: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
8620: 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
8630: 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
8640: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77  tCost ){.    low
8650: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
8660: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
8670: 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  flags;.  }..  /*
8680: 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e   Look at each in
8690: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  dex..  */.  for(
86a0: 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  ; pProbe; pProbe
86b0: 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b  =pProbe->pNext){
86c0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86f0: 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  r */.    double 
8700: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31  inMultiplier = 1
8710: 3b 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e  ;..    TRACE((".
8720: 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c  .. index %s:\n",
8730: 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29   pProbe->zName))
8740: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
8750: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
8760: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
8770: 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69  ex that are sati
8780: 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sfied.    ** by 
8790: 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  x=EXPR constrain
87a0: 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  ts or x IN (...)
87b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
87c0: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d    */.    flags =
87d0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
87e0: 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
87f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
8800: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
8810: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
8820: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
8830: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
8840: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
8850: 51 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29  Q|WO_IN, pProbe)
8860: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
8870: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
8880: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8890: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
88a0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f      if( pTerm->o
88b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
88c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
88d0: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
88e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66  pExpr;.        f
88f0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
8900: 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
8910: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
8920: 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect!=0 ){.      
8930: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
8940: 20 2a 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20   *= 100;.       
8950: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
8960: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
8970: 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70          inMultip
8980: 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70  lier *= pExpr->p
8990: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b  List->nExpr + 1;
89a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
89b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73   }.    }.    cos
89c0: 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
89d0: 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74  wEst[i] * inMult
89e0: 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28  iplier * estLog(
89f0: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20  inMultiplier);. 
8a00: 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20     nEq = i;.    
8a10: 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72  if( pProbe->onEr
8a20: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
8a30: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
8a40: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20  OLUMN_IN)==0.   
8a50: 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50        && nEq==pP
8a60: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
8a70: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
8a80: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
8a90: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
8aa0: 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e  ...... nEq=%d in
8ab0: 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25  Mult=%.9g cost=%
8ac0: 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d  .9g\n", nEq, inM
8ad0: 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29  ultiplier, cost)
8ae0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  );..    /* Look 
8af0: 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  for range constr
8b00: 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20  aints.    */.   
8b10: 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d   if( nEq<pProbe-
8b20: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
8b30: 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
8b40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
8b50: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
8b60: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
8b70: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
8b80: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
8b90: 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
8ba0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
8bb0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  m ){.        fla
8bc0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
8bd0: 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  MN_RANGE;.      
8be0: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
8bf0: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
8c00: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
8c10: 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  LE, pProbe) ){. 
8c20: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
8c30: 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
8c40: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
8c50: 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
8c60: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  }.        if( fi
8c70: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8c80: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
8c90: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f  O_GT|WO_GE, pPro
8ca0: 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
8cb0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
8cc0: 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
8cd0: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a       cost /= 3;.
8ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cf0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
8d00: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
8d10: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
8d20: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
8d30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
8d40: 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c  d the additional
8d50: 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
8d60: 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61   if that is a fa
8d70: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
8d80: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
8d90: 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67  .      if( (flag
8da0: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
8db0: 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  _IN)==0 &&.     
8dc0: 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49        isSortingI
8dd0: 6e 64 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f  ndex(pParse,pPro
8de0: 62 65 2c 70 53 72 63 2d 3e 70 54 61 62 2c 69 43  be,pSrc->pTab,iC
8df0: 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c  ur,pOrderBy,nEq,
8e00: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  &rev) ){.       
8e10: 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b   if( flags==0 ){
8e20: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
8e30: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
8e40: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d  RANGE;.        }
8e50: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
8e60: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  = WHERE_ORDERBY;
8e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76  .        if( rev
8e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
8e90: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
8ea0: 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
8eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ec0: 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
8ed0: 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
8ee0: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
8ef0: 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69  ...... orderby i
8f00: 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f  ncreases cost to
8f10: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
8f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f30: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
8f40: 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67   see if we can g
8f50: 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69  et away with usi
8f60: 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
8f70: 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  x without.    **
8f80: 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68   ever reading th
8f90: 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61  e table.  If tha
8fa0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
8fb0: 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20  hen halve the.  
8fc0: 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69    ** cost of thi
8fd0: 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  s index..    */.
8fe0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26      if( flags &&
8ff0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c   pSrc->colUsed <
9000: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
9010: 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
9020: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
9030: 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
9040: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9050: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62  for(j=0; j<pProb
9060: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  e->nColumn; j++)
9070: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9080: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
9090: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
90a0: 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
90b0: 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
90c0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
90d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
90f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
9100: 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
9110: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f  ONLY;.        co
9120: 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20  st /= 2;.       
9130: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
9140: 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73  idx-only reduces
9150: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
9160: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
9170: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9180: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  If this index ha
9190: 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c  s achieved the l
91a0: 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61  owest cost so fa
91b0: 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a  r, then use it..
91c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
91d0: 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74  ost < lowestCost
91e0: 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64   ){.      bestId
91f0: 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
9200: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
9210: 6f 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ost;.      asser
9220: 74 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20  t( flags!=0 );. 
9230: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
9240: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65   flags;.      be
9250: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
9260: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
9270: 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
9280: 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e  ult.  */.  *ppIn
9290: 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20  dex = bestIdx;. 
92a0: 20 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e   TRACE(("best in
92b0: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
92c0: 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20  %.9g, flags=%x, 
92d0: 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
92e0: 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73     bestIdx ? bes
92f0: 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28  tIdx->zName : "(
9300: 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f  none)", lowestCo
9310: 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62  st, bestFlags, b
9320: 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c  estNEq));.  *pFl
9330: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
9340: 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e  .  *pnEq = bestN
9350: 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77  Eq;.  return low
9360: 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  estCost;.}.../*.
9370: 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
9380: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
9390: 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
93a0: 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
93b0: 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
93c0: 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
93d0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
93e0: 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
93f0: 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
9400: 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
9410: 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
9420: 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
9430: 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
9440: 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
9450: 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
9460: 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
9470: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
9480: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
9490: 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
94a0: 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
94b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
94c0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
94d0: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
94e0: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
94f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9500: 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
9510: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
9520: 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
9530: 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
9540: 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
9550: 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
9560: 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
9570: 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
9580: 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
9590: 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
95a0: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
95b0: 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
95c0: 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
95d0: 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
95e0: 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
95f0: 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
9600: 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
9610: 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
9620: 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
9630: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
9640: 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
9650: 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
9660: 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
9670: 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
9680: 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
9690: 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
96a0: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
96b0: 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
96c0: 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
96d0: 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
96e0: 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
96f0: 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
9700: 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
9710: 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
9720: 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
9730: 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
9740: 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
9750: 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
9760: 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
9770: 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
9780: 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
9790: 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
97a0: 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
97b0: 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
97c0: 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
97d0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
97e0: 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
97f0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
9800: 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
9810: 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
9820: 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  && (pTerm->flags
9830: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
9840: 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
9850: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
9860: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
9870: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
9880: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
9890: 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
98a0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
98b0: 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
98c0: 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
98d0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
98e0: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
98f0: 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
9900: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
9910: 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
9920: 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
9930: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
9940: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
9950: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9960: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
9970: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9980: 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65  t builds a probe
9990: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20   for an index.  
99a0: 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  Details:.**.**  
99b0: 20 20 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74    *  Check the t
99c0: 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69  op nColumn entri
99d0: 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  es on the stack.
99e0: 20 20 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20    If any.**     
99f0: 20 20 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69    of those entri
9a00: 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d  es are NULL, jum
9a10: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
9a20: 20 62 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77   brk,.**       w
9a30: 68 69 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70  hich is the loop
9a40: 20 65 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20   exit, since no 
9a50: 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c  index entry will
9a60: 20 6d 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20   match.**       
9a70: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
9a80: 68 65 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 20  he key is NULL. 
9a90: 50 6f 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78  Pop (nColumn+nEx
9aa0: 74 72 61 29 20 0a 2a 2a 20 20 20 20 20 20 20 65  tra) .**       e
9ab0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
9ac0: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20   stack..**.**   
9ad0: 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20   *  Construct a 
9ae0: 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d  probe entry from
9af0: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
9b00: 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20   entries in.**  
9b10: 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 77       the stack w
9b20: 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20 61  ith affinities a
9b30: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9b40: 6e 64 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20 20  ndex pIdx. .**  
9b50: 20 20 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d       Only nColum
9b60: 6e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 70  n elements are p
9b70: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
9b80: 74 61 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73  tack in this cas
9b90: 65 0a 2a 2a 20 20 20 20 20 20 20 28 62 79 20 4f  e.**       (by O
9ba0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a 2a  P_MakeRecord)..*
9bb0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
9bc0: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
9bd0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 0a 20 20  (.  Vdbe *v, .  
9be0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20  int nColumn, .  
9bf0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
9c00: 6e 74 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65 78  nt brk, .  Index
9c10: 20 2a 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c 69   *pIdx.){.  sqli
9c20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9c30: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f  OP_NotNull, -nCo
9c40: 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62  lumn, sqlite3Vdb
9c50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
9c60: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
9c70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
9c80: 2c 20 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61  , nColumn+nExtra
9c90: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
9ca0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
9cb0: 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20  oto, 0, brk);.  
9cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9cd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9ce0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
9cf0: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
9d00: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
9d10: 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  x);.}.../*.** Ge
9d20: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9d30: 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
9d40: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
9d50: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
9d60: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
9d70: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
9d80: 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
9d90: 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
9da0: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
9db0: 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
9dc0: 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
9dd0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
9de0: 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  aint is left on 
9df0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
9e00: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
9e10: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
9e20: 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
9e30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9e40: 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
9e50: 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
9e60: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
9e70: 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
9e80: 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
9e90: 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
9ea0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
9eb0: 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
9ec0: 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
9ed0: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
9ee0: 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   X..*/.static vo
9ef0: 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  id codeEqualityT
9f00: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
9f10: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
9f20: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
9f30: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
9f40: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
9f50: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
9f60: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
9f70: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
9f80: 62 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  brk,            
9f90: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
9fa0: 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70  abandon the loop
9fb0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
9fc0: 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65   *pLevel  /* Whe
9fd0: 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  n level of the F
9fe0: 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
9ff0: 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
a000: 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
a010: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
a020: 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49  if( pX->op!=TK_I
a030: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
a040: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
a050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a060: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
a070: 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64  ->pRight);.#ifnd
a080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a090: 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
a0a0: 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
a0b0: 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20 20     int *aIn;.   
a0c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a0d0: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20 73  e->pVdbe;..    s
a0e0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
a0f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b  ect(pParse, pX);
a100: 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
a110: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
a120: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a130: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
a140: 20 62 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43   brk);.    VdbeC
a150: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 2e  omment((v, "# %.
a160: 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c  *s", pX->span.n,
a170: 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20   pX->span.z));. 
a180: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b     pLevel->nIn++
a190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 61 6c  ;.    sqliteReal
a1a0: 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69 64 2a  locOrFree((void*
a1b0: 2a 29 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f  *)&pLevel->aInLo
a1c0: 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
a1f0: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  el->aInLoop[0])*
a200: 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a  3*pLevel->nIn);.
a210: 20 20 20 20 61 49 6e 20 3d 20 70 4c 65 76 65 6c      aIn = pLevel
a220: 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  ->aInLoop;.    i
a230: 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( aIn ){.      
a240: 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  aIn += pLevel->n
a250: 49 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20 20  In*3 - 3;.      
a260: 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78 74  aIn[0] = OP_Next
a270: 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d  ;.      aIn[1] =
a280: 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49 6e   iTab;.      aIn
a290: 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [2] = sqlite3Vdb
a2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
a2b0: 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  umn, iTab, 0);. 
a2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2d0: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
a2e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a2f0: 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
a300: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
a310: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a320: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a330: 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
a340: 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
a350: 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
a360: 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73  dex.  The values
a370: 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
a380: 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e  ints are left on
a390: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
a3a0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
a3b0: 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
a3c0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
a3d0: 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
a3e0: 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
a3f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a400: 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
a410: 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
a420: 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
a430: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
a440: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
a450: 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
a460: 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
a470: 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
a480: 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
a490: 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
a4a0: 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
a4b0: 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
a4c0: 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
a4d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
a4e0: 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
a4f0: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
a500: 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
a510: 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
a520: 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
a530: 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65  and b will be le
a540: 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ft.** on the sta
a550: 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64 65  ck - a is the de
a560: 65 70 65 73 74 20 61 6e 64 20 62 20 74 68 65 20  epest and b the 
a570: 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a  shallowest..**.*
a580: 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
a590: 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20   above nEq==2.  
a5a0: 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74  But this subrout
a5b0: 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
a5c0: 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45  y value.** of nE
a5d0: 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20  q including 0.  
a5e0: 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20  If nEq==0, this 
a5f0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c  routine is nearl
a600: 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  y a no-op..** Th
a610: 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20  e only thing it 
a620: 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65  does is allocate
a630: 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   the pLevel->iMe
a640: 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a  m memory cell..*
a650: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a660: 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  e always allocat
a670: 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  es at least one 
a680: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
a690: 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72  puts.** the addr
a6a0: 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  ess of that memo
a6b0: 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65  ry cell in pLeve
a6c0: 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f  l->iMem.  The co
a6d0: 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
a6e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
a6f0: 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69  ll use pLevel->i
a700: 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65  Mem to store the
a710: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
a720: 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
a730: 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
a740: 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
a750: 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
a760: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
a770: 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
a780: 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
a790: 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
a7a0: 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
a7b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
a7c0: 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
a7d0: 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
a7e0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
a7f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a800: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
a810: 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
a820: 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
a830: 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
a840: 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
a850: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
a860: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
a870: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
a880: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
a890: 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
a8a0: 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
a8b0: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
a8c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20  d */.  int brk  
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8e0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64  Jump here to end
a8f0: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a   the loop */.){.
a900: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
a910: 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20  el->nEq;        
a920: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
a930: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
a940: 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
a950: 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65  .  int termsInMe
a960: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
a970: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f   /* If true, sto
a980: 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b  re value in mem[
a990: 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62  ] cells */.  Vdb
a9a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a9b0: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
a9c0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
a9d0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
a9e0: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
a9f0: 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
aa00: 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
aa10: 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
aa20: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
aa30: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
aa40: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
aa50: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
aa60: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
aa70: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
aa80: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
aa90: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
aaa0: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
aab0: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aad0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
aae0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
aaf0: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
ab00: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
ab10: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
ab20: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65  te them..  ** We
ab30: 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20   always need at 
ab40: 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74  least one used t
ab50: 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70  o store the loop
ab60: 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a   terminator.  **
ab70: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72   value.  If ther
ab80: 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f  e are IN operato
ab90: 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e  rs we'll need on
aba0: 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72  e for each == or
abb0: 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61  .  ** IN constra
abc0: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76  int..  */.  pLev
abd0: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
abe0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28  e->nMem++;.  if(
abf0: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
ac00: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
ac10: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
ac20: 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e  nMem += pLevel->
ac30: 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e  nEq;.    termsIn
ac40: 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  Mem = 1;.  }..  
ac50: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
ac60: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
ac70: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ints.  */.  for(
ac80: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
ac90: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
aca0: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
acb0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70  Column[j];.    p
acc0: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
acd0: 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
ace0: 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
acf0: 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _IN, pIdx);.    
ad00: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
ad10: 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
ad20: 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
ad30: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
ad40: 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71 75 61   );.    codeEqua
ad50: 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
ad60: 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65   pTerm, brk, pLe
ad70: 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 74 65  vel);.    if( te
ad80: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
ad90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ada0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
adb0: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b  e, pLevel->iMem+
adc0: 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  j+1, 1);.    }. 
add0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
ade0: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  nEq );..  /* Mak
adf0: 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 63  e sure all the c
ae00: 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
ae10: 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70 20   are on the top 
ae20: 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a  of the stack.  *
ae30: 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d  /.  if( termsInM
ae40: 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  em ){.    for(j=
ae50: 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
ae60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ae70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ae80: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
ae90: 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20  em+j+1, 0);.    
aea0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  }.  }.}..#if def
aeb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
aec0: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  )./*.** The foll
aed0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68  owing variable h
aee0: 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63  olds a text desc
aef0: 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79  ription of query
af00: 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a   plan generated.
af10: 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ** by the most r
af20: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
af30: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
af40: 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  ).  Each call to
af50: 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f   WhereBegin.** o
af60: 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
af70: 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e  evious.  This in
af80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
af90: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
afa0: 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e  d.** analysis on
afb0: 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ly..*/.char sqli
afc0: 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42  te3_query_plan[B
afd0: 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65  MS*2*40];  /* Te
afe0: 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  xt of the join *
aff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50  /.static int nQP
b000: 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lan = 0;        
b010: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
b020: 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72  ee slow in _quer
b030: 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e  y_plan[] */..#en
b040: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
b050: 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ST */..../*.** G
b060: 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
b070: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
b080: 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
b090: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
b0a0: 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
b0b0: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
b0c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
b0d0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
b0e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
b0f0: 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
b100: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
b110: 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
b120: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
b130: 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
b140: 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
b150: 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
b160: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
b170: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
b180: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
b190: 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
b1a0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
b1b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
b1c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
b1d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
b1e0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
b1f0: 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
b200: 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
b210: 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
b220: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
b230: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
b240: 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
b250: 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
b260: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
b270: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
b280: 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
b290: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
b2a0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
b2b0: 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
b2c0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
b2d0: 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
b2e0: 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
b2f0: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
b300: 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
b310: 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
b320: 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
b330: 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
b340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b350: 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
b360: 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
b370: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
b380: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
b390: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
b3a0: 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
b3b0: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
b3c0: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
b3d0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
b3e0: 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
b3f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
b400: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
b410: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
b420: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
b430: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
b440: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b460: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
b470: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
b480: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
b490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
b4a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
b4b0: 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
b4c0: 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
b4d0: 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
b4e0: 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
b4f0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
b500: 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
b510: 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
b520: 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
b530: 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
b540: 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
b550: 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
b560: 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
b570: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
b580: 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
b590: 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
b5a0: 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
b5b0: 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
b5c0: 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
b5d0: 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
b5e0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
b5f0: 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
b600: 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
b610: 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
b620: 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
b630: 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
b640: 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
b650: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
b660: 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
b670: 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
b680: 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
b690: 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
b6a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
b6b0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
b6c0: 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
b6d0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
b6e0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
b6f0: 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
b700: 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
b710: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
b720: 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
b730: 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
b740: 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
b750: 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
b760: 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
b770: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
b780: 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
b790: 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
b7a0: 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
b7b0: 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
b7c0: 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
b7d0: 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
b7e0: 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
b7f0: 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
b800: 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
b810: 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
b820: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b830: 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
b840: 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
b850: 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
b860: 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
b870: 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
b880: 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
b890: 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
b8a0: 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
b8b0: 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
b8c0: 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
b8d0: 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
b8e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
b8f0: 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
b900: 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
b910: 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
b920: 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
b930: 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
b940: 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
b950: 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
b960: 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
b970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b980: 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
b990: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
b9a0: 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
b9b0: 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
b9c0: 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
b9d0: 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
b9e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
b9f0: 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
ba00: 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
ba10: 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
ba20: 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
ba30: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
ba40: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
ba50: 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
ba60: 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
ba70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ba80: 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
ba90: 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
baa0: 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
bab0: 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
bac0: 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
bad0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
bae0: 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
baf0: 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
bb00: 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
bb10: 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
bb20: 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
bb30: 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
bb40: 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
bb50: 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
bb60: 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
bb70: 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
bb80: 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
bb90: 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
bba0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
bbb0: 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
bbc0: 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
bbd0: 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
bbe0: 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
bbf0: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
bc00: 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
bc10: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bc20: 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
bc30: 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
bc40: 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
bc50: 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
bc60: 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
bc70: 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
bc80: 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
bc90: 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
bca0: 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
bcb0: 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
bcc0: 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f  SSING.**.** *ppO
bcd0: 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
bce0: 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
bcf0: 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
bd00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bd10: 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
bd20: 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
bd30: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
bd40: 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
bd50: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
bd60: 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
bd70: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
bd80: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
bd90: 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
bda0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
bdb0: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
bdc0: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
bdd0: 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
bde0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
bdf0: 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
be00: 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
be10: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
be20: 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
be30: 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65  d and.** *ppOrde
be40: 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55  rBy is set to NU
be50: 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  LL.  This is an 
be60: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
be70: 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a  t prevents an.**
be80: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
be90: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
bea0: 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  set if an index 
beb0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bec0: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
bed0: 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
bee0: 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
bef0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
bf00: 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
bf10: 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
bf20: 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
bf30: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
bf40: 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72  , then the *ppOr
bf50: 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67  derBy is unchang
bf60: 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
bf70: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
bf80: 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
bf90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
bfa0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
bfb0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
bfc0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
bfd0: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
bfe0: 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
bff0: 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
c000: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
c010: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c020: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c030: 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a   **ppOrderBy  /*
c040: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
c050: 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
c060: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c090: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
c0a0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
c0b0: 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
c0c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
c0d0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
c0e0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
c0f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
c100: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
c110: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
c120: 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f  */.  int brk, co
c130: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
c140: 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65  /* Addresses use
c150: 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  d during code ge
c160: 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  neration */.  Bi
c170: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
c180: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c190: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
c1a0: 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
c1b0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c1c0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
c1d0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
c1e0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
c1f0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
c200: 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20  skSet maskSet;  
c210: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c220: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
c230: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c240: 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   wc;            
c250: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
c260: 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69  use is divided i
c270: 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20  nto these terms 
c280: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
c290: 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
c2a0: 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
c2b0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
c2c0: 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
c2d0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
c2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
c2f0: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
c300: 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
c310: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
c340: 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
c350: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
c360: 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
c370: 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
c380: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
c390: 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67   all wc.a[].flag
c3a0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  s */..  /* The n
c3b0: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
c3c0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c3d0: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
c3e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
c3f0: 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
c400: 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66  tmask .  */.  if
c410: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
c420: 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
c430: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c440: 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
c450: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
c460: 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
c470: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
c480: 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
c490: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
c4a0: 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
c4b0: 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
c4c0: 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
c4d0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
c4e0: 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
c4f0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
c500: 61 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29  askSet(&maskSet)
c510: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
c520: 6e 69 74 28 26 77 63 2c 20 70 50 61 72 73 65 29  nit(&wc, pParse)
c530: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
c540: 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  wc, pWhere, TK_A
c550: 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41  ND);.    .  /* A
c560: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
c570: 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
c580: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
c590: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
c5a0: 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
c5b0: 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57  value..  */.  pW
c5c0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
c5d0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72  loc( sizeof(Wher
c5e0: 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73  eInfo) + pTabLis
c5f0: 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57  t->nSrc*sizeof(W
c600: 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69  hereLevel));.  i
c610: 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  f( sqlite3Thread
c620: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e  DataReadOnly()->
c630: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c640: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
c650: 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20  ginNoMem;.  }.  
c660: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
c670: 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
c680: 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
c690: 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
c6a0: 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
c6b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c6c0: 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  v);..  /* Specia
c6d0: 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
c6e0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
c6f0: 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
c700: 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
c710: 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
c720: 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
c730: 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
c740: 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
c750: 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
c760: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
c770: 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
c780: 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  IsConstant(pWher
c790: 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
c7a0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
c7b0: 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
c7c0: 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29  Info->iBreak, 1)
c7d0: 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
c7e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  ;.  }..  /* Anal
c7f0: 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
c800: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
c810: 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
c820: 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
c830: 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
c840: 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
c850: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
c860: 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
c870: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
c880: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
c890: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
c8a0: 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
c8b0: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
c8c0: 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
c8d0: 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
c8e0: 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
c8f0: 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
c900: 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
c910: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
c920: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
c930: 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
c940: 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
c950: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
c960: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61  );.  }.  exprAna
c970: 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
c980: 2c 20 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29  , &maskSet, &wc)
c990: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
c9a0: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
c9b0: 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  y()->mallocFaile
c9c0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
c9d0: 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20  ereBeginNoMem;. 
c9e0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74   }..  /* Chose t
c9f0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f  he best index to
ca00: 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61   use for each ta
ca10: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
ca20: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
ca30: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c  * This loop fill
ca40: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
ca50: 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a  ng fields:.  **.
ca60: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
ca70: 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65  [].pIdx      The
ca80: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
ca90: 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20  r this level of 
caa0: 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20  the loop..  **  
cab0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61   pWInfo->a[].fla
cac0: 67 73 20 20 20 20 20 57 48 45 52 45 5f 78 78 78  gs     WHERE_xxx
cad0: 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   flags associate
cae0: 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a  d with pIdx.  **
caf0: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e     pWInfo->a[].n
cb00: 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d  Eq       The num
cb10: 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e  ber of == and IN
cb20: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
cb30: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
cb40: 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e 20 74  iFrom     When t
cb50: 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
cb60: 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
cb70: 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
cb80: 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
cb90: 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
cba0: 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
cbb0: 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
cbc0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
cbd0: 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
cbe0: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
cbf0: 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ndex.  **.  ** T
cc00: 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69  his loop also fi
cc10: 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65  gures out the ne
cc20: 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74  sting order of t
cc30: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
cc40: 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  M.  ** clause.. 
cc50: 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
cc60: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
cc70: 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c  pTabItem = pTabL
cc80: 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c  ist->a;.  pLevel
cc90: 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20   = pWInfo->a;.  
cca0: 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20  andFlags = ~0;. 
ccb0: 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74   TRACE(("*** Opt
ccc0: 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
ccd0: 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69  \n"));.  for(i=i
cce0: 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  From=0, pLevel=p
ccf0: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
cd00: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
cd10: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
cd20: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cd40: 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
cd50: 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
cd60: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
cd70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd80: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73     /* Flags asss
cd90: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
cda0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71  x */.    int nEq
cdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cdd0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
cde0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f  raints */.    do
cdf0: 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
ce00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ce10: 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a   cost for pIdx *
ce20: 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ce50: 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
ce60: 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
ce70: 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
ce80: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
ce90: 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66   index seen so f
cea0: 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  ar */.    int be
ceb0: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
cec0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
ced0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
cee0: 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
cef0: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61          /* nEq a
cf10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
cf20: 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62  Best */.    doub
cf30: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
cf40: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
cf50: 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a  of the pBest */.
cf60: 20 20 20 20 69 6e 74 20 62 65 73 74 4a 3b 20 20      int bestJ;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
cf90: 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
cfa0: 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
cfb0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
cfc0: 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
cfd0: 65 73 74 4a 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77  estJ */..    low
cfe0: 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  estCost = SQLITE
cff0: 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f  _BIG_DBL;.    fo
d000: 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
d010: 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
d020: 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  [j]; j<pTabList-
d030: 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nSrc; j++, pTab
d040: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  Item++){.      m
d050: 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
d060: 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
d070: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
d080: 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
d090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d0a0: 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
d0b0: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
d0c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d0d0: 7d 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62  }.      cost = b
d0e0: 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
d0f0: 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
d100: 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
d130: 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
d140: 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
d160: 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45  Idx, &flags, &nE
d170: 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  q);.      if( co
d180: 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b  st<lowestCost ){
d190: 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43  .        lowestC
d1a0: 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
d1b0: 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
d1c0: 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46 6c  ;.        bestFl
d1d0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
d1e0: 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
d1f0: 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  Eq;.        best
d200: 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  J = j;.      }. 
d210: 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74       if( (pTabIt
d220: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
d230: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
d240: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ))!=0.         |
d250: 7c 20 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49  | (j>0 && (pTabI
d260: 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  tem[-1].jointype
d270: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
d280: 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 20  ROSS))!=0).     
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
d2a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
d2b0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2a 2a 2a  .    TRACE(("***
d2c0: 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73   Optimizer choos
d2d0: 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  e table %d for l
d2e0: 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
d2f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
d300: 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
d310: 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
d320: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
d330: 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
d340: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
d350: 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
d360: 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
d370: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
d380: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
d390: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
d3a0: 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
d3b0: 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
d3c0: 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
d3d0: 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
d3e0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
d3f0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
d400: 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
d410: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
d420: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
d440: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
d450: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
d460: 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
d470: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
d480: 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
d490: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
d4a0: 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
d4b0: 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  stJ;.  }.  TRACE
d4c0: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
d4d0: 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
d4e0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
d4f0: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
d500: 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
d510: 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
d520: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
d530: 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
d540: 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
d550: 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
d560: 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
d570: 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
d580: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
d590: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
d5a0: 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
d5b0: 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
d5c0: 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
d5d0: 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
d5e0: 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
d5f0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
d600: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
d610: 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
d620: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
d630: 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
d640: 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20  oto */.  pLevel 
d650: 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66  = pWInfo->a;.  f
d660: 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
d670: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
d680: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
d690: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
d6a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
d6b0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
d6c0: 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
d6d0: 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  pIx;      /* Ind
d6e0: 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
d6f0: 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20  s pTab (if any) 
d700: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
d710: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d720: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
d730: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
d740: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
d750: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
d760: 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64  >iIdxCur;..#ifnd
d770: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
d780: 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
d790: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
d7a0: 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  2 ){.      char 
d7b0: 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72  *zMsg;.      str
d7c0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
d7d0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
d7e0: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
d7f0: 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73  From];.      zMs
d800: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
d810: 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70  tf("TABLE %s", p
d820: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
d830: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
d840: 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
d850: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
d860: 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73  Printf("%z AS %s
d870: 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
d880: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
d890: 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 78 20  .      if( (pIx 
d8a0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
d8b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  =0 ){.        zM
d8c0: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
d8d0: 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44  ntf("%z WITH IND
d8e0: 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  EX %s", zMsg, pI
d8f0: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
d900: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
d910: 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
d920: 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
d930: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
d940: 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
d950: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
d960: 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  %z USING PRIMARY
d970: 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   KEY", zMsg);.  
d980: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d990: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
d9a0: 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
d9b0: 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel->iFrom, zMsg
d9c0: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
d9d0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
d9e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
d9f0: 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74  IN */.    pTabIt
da00: 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
da10: 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
da20: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
da30: 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
da40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
da50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
da60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
da70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20  chema);.    if( 
da80: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
da90: 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  t || pTab->pSele
daa0: 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ct ) continue;. 
dab0: 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
dac0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
dad0: 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
dae0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
daf0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
db00: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
db10: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
db20: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 7d 65 6c  enRead);.    }el
db30: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
db40: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
db50: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
db60: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
db70: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
db80: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
db90: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
dba0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78  or;.    if( (pIx
dbb0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29   = pLevel->pIdx)
dbc0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  !=0 ){.      Key
dbd0: 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
dbe0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
dbf0: 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
dc00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
dc10: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
dc20: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
dc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc40: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
dc50: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
dc60: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
dc70: 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e   "# %s", pIx->zN
dc80: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
dc90: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
dca0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
dcb0: 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a  Cur, pIx->tnum,.
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
dce0: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
dcf0: 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20  DOFF);.    }.   
dd00: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
dd10: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
dd20: 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
dd30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dd40: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
dd50: 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c  olumns, iIdxCur,
dd60: 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29   pIx->nColumn+1)
dd70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
dd80: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
dd90: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
dda0: 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
ddb0: 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
ddc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ddd0: 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
dde0: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
ddf0: 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
de00: 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
de10: 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
de20: 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
de30: 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
de40: 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
de50: 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
de60: 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
de70: 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
de80: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  sk)0;.  for(i=0,
de90: 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
dea0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
deb0: 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
dec0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
ded0: 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
dee0: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
def0: 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63  ;  /* The VDBE c
df00: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
df10: 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ble */.    Index
df20: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a   *pIdx;       /*
df30: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
df40: 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
df50: 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
df60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
df70: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
df80: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
df90: 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
dfa0: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
dfb0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
dfc0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65  y */.    int bRe
dfd0: 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  v;          /* T
dfe0: 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
dff0: 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
e000: 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20  e order */..    
e010: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
e020: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
e030: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72  iFrom];.    iCur
e040: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
e050: 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d  rsor;.    pIdx =
e060: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20   pLevel->pIdx;. 
e070: 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
e080: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
e090: 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
e0a0: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
e0b0: 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20  REVERSE)!=0;.   
e0c0: 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
e0d0: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e0e0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
e0f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
e100: 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
e110: 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
e120: 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
e130: 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ons.    ** for t
e140: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
e150: 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f    Jump to brk to
e160: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
e170: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d  loop..    ** Jum
e180: 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
e190: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
e1a0: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
e1b0: 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  n of the.    ** 
e1c0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
e1d0: 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
e1e0: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
e1f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e200: 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d    cont = pLevel-
e210: 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  >cont = sqlite3V
e220: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
e230: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
e240: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
e250: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
e260: 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
e270: 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e  te and.    ** in
e280: 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
e290: 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
e2a0: 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
e2b0: 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
e2c0: 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
e2d0: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
e2e0: 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e join..    */. 
e2f0: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
e300: 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
e310: 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  tem[-1].jointype
e320: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
e330: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
e340: 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72  rse->nMem ) pPar
e350: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
e360: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
e370: 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  oin = pParse->nM
e380: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  em++;.      sqli
e390: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e3a0: 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c  OP_MemInt, 0, pL
e3b0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
e3c0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
e3d0: 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20  ent((v, "# init 
e3e0: 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
e3f0: 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  ch flag"));.    
e400: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  }..    if( pLeve
e410: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
e420: 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
e430: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
e440: 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
e450: 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
e460: 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
e470: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
e480: 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
e490: 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
e4a0: 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
e4b0: 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
e4c0: 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
e4d0: 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
e4e0: 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
e4f0: 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a   (...)".      **
e500: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
e510: 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uct..      */.  
e520: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
e530: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
e540: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
e550: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
e560: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
e570: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rm!=0 );.      a
e580: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
e590: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
e5a0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c  assert( pTerm->l
e5b0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
e5c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e5d0: 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
e5e0: 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c  .      codeEqual
e5f0: 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
e600: 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76  pTerm, brk, pLev
e610: 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  el);.      sqlit
e620: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e630: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20  P_MustBeInt, 1, 
e640: 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  brk);.      sqli
e650: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e660: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
e670: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
e680: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e690: 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c  "pk"));.      pL
e6a0: 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
e6b0: 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
e6c0: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
e6d0: 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
e6e0: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
e6f0: 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
e700: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
e710: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
e720: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
e730: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
e740: 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
e750: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e  P_Noop;.      in
e760: 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57  t start;.      W
e770: 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
e780: 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20  , *pEnd;..      
e790: 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
e7a0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  e==0 );.      pS
e7b0: 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
e7c0: 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
e7d0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
e7e0: 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_GE, 0);.      
e7f0: 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
e800: 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
e810: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
e820: 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_LE, 0);.      
e830: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
e840: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
e850: 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61  rt;.        pSta
e860: 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
e870: 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
e880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e890: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
e8a0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
e8b0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61         pX = pSta
e8c0: 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
e8d0: 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
e8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
e8f0: 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
e900: 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
e910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e920: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e930: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
e940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e950: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72 63  AddOp(v, OP_Forc
e960: 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  eInt, pX->op==TK
e970: 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LE || pX->op==T
e980: 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20  K_GT, brk);.    
e990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9a0: 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f  ddOp(v, bRev ? O
e9b0: 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f  P_MoveLt : OP_Mo
e9c0: 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 29  veGe, iCur, brk)
e9d0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
e9e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
e9f0: 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
ea00: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
ea10: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tart);.      }el
ea20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ea30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ea40: 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
ea50: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
ea60: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
ea70: 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29        if( pEnd )
ea80: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
ea90: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
eaa0: 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
eab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
eac0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
ead0: 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
eae0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
eaf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
eb10: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
eb20: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
eb30: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
eb40: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  m++;.        sql
eb50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
eb60: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
eb70: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
eb80: 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e          if( pX->
eb90: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
eba0: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
ebb0: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
ebc0: 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
ebd0: 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Ge;.        }
ebe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ebf0: 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
ec00: 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
ec10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ec20: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
ec30: 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
ec40: 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20    }.      start 
ec50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ec60: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
ec70: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
ec80: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
ec90: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
eca0: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
ecb0: 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
ecc0: 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
ecd0: 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
ece0: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
ecf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ed00: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  Op(v, OP_Rowid, 
ed10: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
ed20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ed30: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
ed40: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
ed50: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
ed60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ed70: 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f 41  testOp, SQLITE_A
ed80: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72 6b 29  FF_NUMERIC, brk)
ed90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
eda0: 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
edb0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
edc0: 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
edd0: 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 54      /* Case 3: T
ede0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
edf0: 74 65 72 6d 20 74 68 61 74 20 72 65 66 65 72 73  term that refers
ee00: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ee10: 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
ee20: 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68      column of th
ee30: 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6e  e index is an in
ee40: 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72 20 65  equality.  For e
ee50: 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20 20  xample, if.     
ee60: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
ee70: 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
ee80: 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48 45 52  ,z) and the WHER
ee90: 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  E clause is of t
eea0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  he.      **     
eeb0: 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20 41 4e      form "x=5 AN
eec0: 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74 68 69  D y<10" then thi
eed0: 73 20 63 61 73 65 20 69 73 20 75 73 65 64 2e 20  s case is used. 
eee0: 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20 20   Only the.      
eef0: 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67 68 74  **         right
ef00: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
ef10: 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
ef20: 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
ef30: 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  t.      **      
ef40: 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
ef50: 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
ef60: 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rs..      **.   
ef70: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
ef80: 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
ef90: 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
efa0: 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
efb0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  use.      **    
efc0: 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
efd0: 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
efe0: 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
eff0: 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20  , in order.     
f000: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
f010: 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
f020: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
f030: 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
f040: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f050: 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
f060: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
f070: 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e  l->nEq;.      in
f080: 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20 20 20  t topEq=0;      
f090: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 70    /* True if top
f0a0: 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20   limit uses ==. 
f0b0: 46 61 6c 73 65 20 69 73 20 73 74 72 69 63 74 6c  False is strictl
f0c0: 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  y < */.      int
f0d0: 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20 20 20   btmEq=0;       
f0e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74 6d 20   /* True if btm 
f0f0: 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46  limit uses ==. F
f100: 61 6c 73 65 20 69 66 20 73 74 72 69 63 74 6c 79  alse if strictly
f110: 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20   > */.      int 
f120: 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20 20  topOp, btmOp;   
f130: 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66 6f 72  /* Operators for
f140: 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62 6f 74   the top and bot
f150: 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75 6e 64  tom search bound
f160: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74  s */.      int t
f170: 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e 74  estOp;.      int
f180: 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20   nNotNull;      
f190: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
f1a0: 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68 61 74  ws of index that
f1b0: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
f1c0: 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74  L */.      int t
f1d0: 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  opLimit = (pLeve
f1e0: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
f1f0: 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _TOP_LIMIT)!=0;.
f200: 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d        int btmLim
f210: 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
f220: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
f230: 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20 20  LIMIT)!=0;..    
f240: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f250: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
f260: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
f270: 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
f280: 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  IN.      ** and 
f290: 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73  level the values
f2a0: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
f2b0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
f2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
f2d0: 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
f2e0: 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
f2f0: 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c  , &wc, notReady,
f300: 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a   brk);..      /*
f310: 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 65   Duplicate the e
f320: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61 6c  quality term val
f330: 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65 79  ues because they
f340: 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20 20   will all be.   
f350: 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63 65     ** used twice
f360: 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74  : once to make t
f370: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
f380: 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20 6d  ey and once to m
f390: 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ake the.      **
f3a0: 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20   start key..    
f3b0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a    */.      for(j
f3c0: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
f3d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f3e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f3f0: 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29 3b 0a  Dup, nEq-1, 0);.
f400: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f410: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
f420: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  t comparison ope
f430: 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20 66 6f  rators to use fo
f440: 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  r top and bottom
f450: 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61 72 63   .      ** searc
f460: 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20 61 6e  h bounds. For an
f470: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
f480: 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62 6f 75  , the bottom bou
f490: 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e 3d 0a  nd is a > or >=.
f4a0: 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f        ** operato
f4b0: 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20 62 6f  r and the top bo
f4c0: 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20 3c 3d  und is a < or <=
f4d0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f 72 20   operator.  For 
f4e0: 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20 20  a descending.   
f4f0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68 65 20     ** index the 
f500: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 72 65  operators are re
f510: 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  versed..      */
f520: 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c 6c 20  .      nNotNull 
f530: 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74  = nEq + topLimit
f540: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
f550: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
f560: 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
f570: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f   ){.        topO
f580: 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  p = WO_LT|WO_LE;
f590: 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d  .        btmOp =
f5a0: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20   WO_GT|WO_GE;.  
f5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f5c0: 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47 54     topOp = WO_GT
f5d0: 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20 20  |WO_GE;.        
f5e0: 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f  btmOp = WO_LT|WO
f5f0: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57 41  _LE;.        SWA
f600: 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74 2c  P(int, topLimit,
f610: 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20 20   btmLimit);.    
f620: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
f630: 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d 69  nerate the termi
f640: 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69  nation key.  Thi
f650: 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61 6c  s is the key val
f660: 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ue that.      **
f670: 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73 65   will end the se
f680: 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
f690: 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  no termination k
f6a0: 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  ey if there.    
f6b0: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75 61    ** are no equa
f6c0: 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20 6e  lity terms and n
f6d0: 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a  o "X<..." term..
f6e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f6f0: 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f  * 2002-Dec-04: O
f700: 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  n a reverse-orde
f710: 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63  r scan, the so-c
f720: 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74 69  alled "terminati
f730: 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  on".      ** key
f740: 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20 72   computed here r
f750: 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65  eally ends up be
f760: 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b 65  ing the start ke
f770: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
f780: 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29    if( topLimit )
f790: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
f7a0: 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
f7b0: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
f7c0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
f7d0: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
f7e0: 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
f7f0: 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70  tReady, topOp, p
f800: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
f810: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
f820: 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
f830: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
f840: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
f850: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
f860: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
f870: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f880: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f890: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
f8a0: 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54 65 72      topEq = pTer
f8b0: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 28 57  m->operator & (W
f8c0: 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
f8d0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
f8e0: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
f8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
f900: 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20 20  = OP_IdxGE;.    
f910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f920: 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20   testOp = nEq>0 
f930: 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f  ? OP_IdxGE : OP_
f940: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 74 6f  Noop;.        to
f950: 70 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  pEq = 1;.      }
f960: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
f970: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
f980: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
f990: 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b   nEq + topLimit;
f9a0: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
f9b0: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
f9c0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
f9d0: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
f9e0: 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c 20 62 72  v, nCol, nEq, br
f9f0: 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
fa00: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
fa10: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
fa20: 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65   topEq ? OP_Move
fa30: 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a  Le : OP_MoveLt;.
fa40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fa50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
fa60: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
fa70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fa80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fa90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
faa0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
fab0: 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  l->iMem, 1);.   
fac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
fad0: 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
fae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
faf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61  beAddOp(v, OP_La
fb00: 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  st, iIdxCur, brk
fb10: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
fb20: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
fb30: 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68  e start key.  Th
fb40: 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68  is is the key th
fb50: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c  at defines the l
fb60: 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f  ower.      ** bo
fb70: 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63  und on the searc
fb80: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
fb90: 73 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65  start key if the
fba0: 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20  re are no.      
fbb0: 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  ** equality term
fbc0: 73 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69  s and if there i
fbd0: 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72  s no "X>..." ter
fbe0: 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20  m.  In.      ** 
fbf0: 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72  that case, gener
fc00: 61 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69  ate a "Rewind" i
fc10: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c  nstruction in pl
fc20: 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ace of the.     
fc30: 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65   ** start key se
fc40: 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  arch..      **. 
fc50: 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63       ** 2002-Dec
fc60: 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65  -04: In the case
fc70: 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72   of a reverse-or
fc80: 64 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20  der search, the 
fc90: 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20  so-called.      
fca0: 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72  ** "start" key r
fcb0: 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65  eally ends up be
fcc0: 69 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20  ing used as the 
fcd0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e  termination key.
fce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fcf0: 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a  if( btmLimit ){.
fd00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
fd10: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20  ;.        int k 
fd20: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
fd30: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  [j];.        pTe
fd40: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rm = findTerm(&w
fd50: 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  c, iCur, k, notR
fd60: 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64  eady, btmOp, pId
fd70: 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  x);.        asse
fd80: 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
fd90: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
fda0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
fdb0: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
fdc0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
fdd0: 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  CODED)==0 );.   
fde0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fdf0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
fe00: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
fe10: 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d 2d    btmEq = pTerm-
fe20: 3e 6f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  >operator & (WO_
fe30: 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20  LE|WO_GE);.     
fe40: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
fe50: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
fe60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fe70: 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b 0a 20      btmEq = 1;. 
fe80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fe90: 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d   nEq>0 || btmLim
fea0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  it ){.        in
feb0: 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62  t nCol = nEq + b
fec0: 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  tmLimit;.       
fed0: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
fee0: 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c 20 62 72 6b  (v, nCol, 0, brk
fef0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
ff00: 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
ff10: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
ff20: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
ff30: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
ff40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff50: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
ff60: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
ff70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
ff80: 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a  tOp = OP_IdxLT;.
ff90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ffa0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
ffb0: 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76  = btmEq ? OP_Mov
ffc0: 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b  eGe : OP_MoveGt;
ffd0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ffe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
fff0: 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  p, iIdxCur, brk)
10000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10010 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
10020 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
10030 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
10040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10060 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
10070 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
10080 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10090 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
100a0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
100b0 6f 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20 69  oop.  If there i
100c0 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  s a termination.
100d0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20        ** key we 
100e0 68 61 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72  have to test for
100f0 20 74 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62   that key and ab
10100 6f 72 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ort at the top o
10110 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  f the.      ** l
10120 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
10130 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
10140 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10150 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  dr(v);.      if(
10160 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
10170 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10180 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10190 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
101a0 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
101b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
101c0 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70  eAddOp(v, testOp
101d0 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
101e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 74 6f  .        if( (to
101f0 70 45 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c  pEq && !bRev) ||
10200 20 28 21 62 74 6d 45 71 20 26 26 20 62 52 65 76   (!btmEq && bRev
10210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
10220 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10230 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50  P3(v, -1, "+", P
10240 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10250 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10270 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  dOp(v, OP_RowKey
10280 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  , iIdxCur, 0);. 
10290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
102b0 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c  sNull, nNotNull,
102c0 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
102d0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
102e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
102f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10300 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
10310 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10330 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
10340 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  r, 0);.      }..
10350 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20        /* Record 
10360 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
10370 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
10380 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  e the loop..    
10390 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65    */.      pLeve
103a0 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
103b0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
103c0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
103d0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
103e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
103f0 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73   start;.    }els
10400 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
10410 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
10420 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  MN_EQ ){.      /
10430 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65 72 65  * Case 4:  There
10440 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   is an index and
10450 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
10460 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
10470 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  hat.      **    
10480 20 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74        refer to t
10490 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  he index using t
104a0 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  he "==" or "IN" 
104b0 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20  operators..     
104c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
104d0 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
104e0 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
104f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
10500 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
10510 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
10520 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
10530 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20   == or IN.      
10540 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65  ** and leave the
10550 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
10560 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74   terms on the st
10570 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
10580 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c      codeAllEqual
10590 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
105a0 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f   pLevel, &wc, no
105b0 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20  tReady, brk);.. 
105c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
105d0 20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68   a single key th
105e0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
105f0 74 6f 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e  to both start an
10600 64 20 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20  d terminate.    
10610 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a    ** the search.
10620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62        */.      b
10630 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76  uildIndexProbe(v
10640 2c 20 6e 45 71 2c 20 30 2c 20 62 72 6b 2c 20 70  , nEq, 0, brk, p
10650 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Idx);.      sqli
10660 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10670 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
10680 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a  vel->iMem, 0);..
10690 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
106a0 65 20 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f  e code (1) to mo
106b0 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
106c0 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74  matching element
106d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
106e0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e       ** Then gen
106f0 65 72 61 74 65 20 63 6f 64 65 20 28 32 29 20 74  erate code (2) t
10700 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 22 62 72  hat jumps to "br
10710 6b 22 20 61 66 74 65 72 20 74 68 65 20 63 75 72  k" after the cur
10720 73 6f 72 20 69 73 20 70 61 73 74 0a 20 20 20 20  sor is past.    
10730 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61    ** the last ma
10740 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  tching element o
10750 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
10760 65 20 63 6f 64 65 20 28 31 29 20 69 73 20 65 78  e code (1) is ex
10770 65 63 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ecuted.      ** 
10780 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
10790 7a 65 20 74 68 65 20 73 65 61 72 63 68 2c 20 74  ze the search, t
107a0 68 65 20 63 6f 64 65 20 28 32 29 20 69 73 20 65  he code (2) is e
107b0 78 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 65  xecuted before e
107c0 61 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65  ach.      ** ite
107d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  ration of the sc
107e0 61 6e 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  an to see if the
107f0 20 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68   scan has finish
10800 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ed. */.      if(
10810 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
10820 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
10830 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  rse order */.   
10840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10850 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
10860 4c 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Le, iIdxCur, brk
10870 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
10880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10890 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
108a0 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
108b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
108c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
108d0 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43   OP_IdxLT, iIdxC
108e0 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
108f0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
10900 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  P_Prev;.      }e
10910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
10920 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77  Scan in the forw
10930 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ard order */.   
10940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10950 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
10960 47 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Ge, iIdxCur, brk
10970 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
10980 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10990 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
109a0 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
109b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
109c0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
109d0 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72  P_IdxGE, iIdxCur
109e0 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33 5f 53  , brk, "+", P3_S
109f0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
10a00 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
10a10 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a30 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
10a40 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  y, iIdxCur, 0);.
10a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10a70 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e  IsNull, nEq, con
10a80 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f  t);.      if( !o
10a90 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
10aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ab0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
10ac0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29  wid, iIdxCur, 0)
10ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10ae0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10af0 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
10b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10b10 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
10b20 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65  dxCur;.      pLe
10b30 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
10b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10b50 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
10b60 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
10b70 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
10b80 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
10b90 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
10ba0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
10bb0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  ire table..     
10bc0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10bd0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
10be0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10bf0 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  bRev==0 );.     
10c00 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
10c10 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
10c20 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
10c30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
10c40 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
10c50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
10c60 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29  wind, iCur, brk)
10c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
10c80 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
10c90 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  (&maskSet, iCur)
10ca0 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
10cb0 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
10cc0 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
10cd0 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
10ce0 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20  mpletely.    ** 
10cf0 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
10d00 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
10d10 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f  f tables..    */
10d20 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77  .    for(pTerm=w
10d30 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b  c.a, j=wc.nTerm;
10d40 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
10d50 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
10d60 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pE;.      if( p
10d70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
10d80 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10d90 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
10da0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
10db0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10dc0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
10dd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10de0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
10df0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
10e00 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pE!=0 );.     
10e10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
10e20 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
10e30 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
10e40 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
10e50 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
10e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10e70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
10e80 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f  e(pParse, pE, co
10e90 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54  nt, 1);.      pT
10ea0 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
10eb0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
10ec0 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  .    /* For a LE
10ed0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
10ee0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10ef0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
10f00 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20  e fact that.    
10f10 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
10f20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
10f30 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
10f40 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
10f50 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  e.  .    */.    
10f60 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
10f70 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  tJoin ){.      p
10f80 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c  Level->top = sql
10f90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10fa0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
10fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10fc0 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
10fd0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10fe0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
10ff0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65 63  mment((v, "# rec
11000 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
11010 74 22 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  t"));.      for(
11020 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b  pTerm=wc.a, j=0;
11030 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b   j<wc.nTerm; j++
11040 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
11050 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
11060 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
11070 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
11080 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11090 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
110a0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
110b0 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
110c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
110d0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
110e0 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pr );.        sq
110f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
11100 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
11110 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20 31 29 3b  pExpr, cont, 1);
11120 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
11130 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
11140 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  DED;.      }.   
11150 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
11160 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
11170 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
11180 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
11190 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
111a0 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
111b0 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
111c0 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
111d0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
111e0 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
111f0 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
11200 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
11210 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
11220 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
11230 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
11240 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
11250 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
11260 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
11270 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
11280 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
11290 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
112a0 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
112b0 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
112c0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
112d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
112e0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
112f0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
11300 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
11310 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
11320 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
11330 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
11340 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
11350 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
11360 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
11370 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
11380 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29     n = strlen(z)
11390 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c  ;.    if( n+nQPl
113a0 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
113b0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
113c0 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  10 ){.      if( 
113d0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
113e0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
113f0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  {.        strcpy
11400 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
11410 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
11420 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50  }");.        nQP
11430 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  lan += 2;.      
11440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
11450 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
11460 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
11470 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 6e  ], z);.        n
11480 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
11490 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
114a0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
114b0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
114c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
114d0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
114e0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
114f0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
11500 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  {.      strcpy(&
11510 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11520 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22  an[nQPlan], "* "
11530 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
11540 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
11550 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
11560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
11570 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
11580 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
11590 20 22 7b 7d 20 22 29 3b 0a 20 20 20 20 20 20 6e   "{} ");.      n
115a0 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20  QPlan += 3;.    
115b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
115c0 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e   strlen(pLevel->
115d0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
115e0 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
115f0 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
11600 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20  3_query_plan)-2 
11610 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  ){.        strcp
11620 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
11630 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70  _plan[nQPlan], p
11640 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
11650 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50  me);.        nQP
11660 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
11670 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
11680 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
11690 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ' ';.      }.  
116a0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
116b0 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c   nQPlan>0 && sql
116c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
116d0 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29  nQPlan-1]==' ' )
116e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75  {.    sqlite3_qu
116f0 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61  ery_plan[--nQPla
11700 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  n] = 0;.  }.  sq
11710 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11720 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  [nQPlan] = 0;.  
11730 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64  nQPlan = 0;.#end
11740 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
11750 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64  T // Testing and
11760 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
11770 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63  nly */..  /* Rec
11780 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ord the continua
11790 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20  tion address in 
117a0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
117b0 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20  ructure.  Then. 
117c0 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64   ** clean up and
117d0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
117e0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
117f0 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68 65 72  e = cont;.  wher
11800 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
11810 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
11820 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
11830 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
11840 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
11850 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72 65 43  nNoMem:.  whereC
11860 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b  lauseClear(&wc);
11870 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57  .  sqliteFree(pW
11880 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
11890 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
118a0 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
118b0 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
118c0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
118d0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
118e0 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
118f0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
11900 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
11910 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
11920 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
11930 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49  .  Vdbe *v = pWI
11940 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  nfo->pParse->pVd
11950 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
11960 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11970 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l;.  SrcList *pT
11980 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
11990 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a  >pTabList;..  /*
119a0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
119b0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
119c0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54  .  */.  for(i=pT
119d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20  abList->nSrc-1; 
119e0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
119f0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
11a00 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  ->a[i];.    sqli
11a10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11a20 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63  bel(v, pLevel->c
11a30 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
11a40 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
11a50 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
11a60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70  e3VdbeAddOp(v, p
11a70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
11a80 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
11a90 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
11aa0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11ab0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
11ac0 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  >brk);.    if( p
11ad0 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20  Level->nIn ){.  
11ae0 20 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20 20 20      int *a;.    
11af0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
11b00 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e  or(j=pLevel->nIn
11b10 2c 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e  , a=&pLevel->aIn
11b20 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b 20 6a 3e 30  Loop[j*3-3]; j>0
11b30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29 7b 0a 20 20  ; j--, a-=3){.  
11b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11b50 65 41 64 64 4f 70 28 76 2c 20 61 5b 30 5d 2c 20  eAddOp(v, a[0], 
11b60 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 20  a[1], a[2]);.   
11b70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11b80 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49  eFree(pLevel->aI
11b90 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
11ba0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
11bb0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
11bc0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
11bd0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11be0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11bf0 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  fMemPos, pLevel-
11c00 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a  >iLeftJoin, 0);.
11c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11c20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
11c30 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
11c40 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29  a[i].iCursor, 0)
11c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
11c60 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
11c70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11c80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11c90 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
11ca0 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  ->iIdxCur, 0);. 
11cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11cd0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
11ce0 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20  vel->top);.     
11cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11d00 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
11d10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
11d20 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
11d30 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
11d40 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
11d50 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
11d60 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
11d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11d80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
11d90 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
11da0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
11db0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
11dc0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
11dd0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11de0 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  gin..  */.  for(
11df0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
11e00 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
11e10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
11e20 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
11e30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
11e40 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
11e50 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
11e60 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
11e70 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
11e80 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
11e90 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
11ea0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
11eb0 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20  >isTransient || 
11ec0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
11ed0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
11ee0 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
11ef0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
11f00 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
11f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11f20 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
11f30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
11f40 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
11f50 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d  ( pLevel->pIdx!=
11f60 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11f70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11f80 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
11f90 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20  >iIdxCur, 0);.  
11fa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
11fb0 20 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75   cursor substitu
11fc0 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20  tions for cases 
11fd0 77 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f  where we want to
11fe0 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74   use.    ** just
11ff0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e   the index and n
12000 65 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74  ever reference t
12010 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
12020 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
12030 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
12040 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
12050 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12060 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
12070 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
12080 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
12090 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
120a0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
120b0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
120c0 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
120d0 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
120e0 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
120f0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
12100 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
12110 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
12120 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
12130 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
12140 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
12150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12160 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
12170 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
12180 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
12190 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
121a0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
121b0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
121c0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20  pLevel->pIdx;.. 
121d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
121e0 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
121f0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
12200 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
12210 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
12220 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
12230 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12240 20 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66       for(i=pWInf
12250 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73 74 3b  o->iTop; i<last;
12260 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i++, pOp++){.  
12270 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
12280 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
12290 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
122a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
122b0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
122c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
122d0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
122e0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
122f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
12300 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
12310 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12320 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
12330 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
12340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12350 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
12360 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
12370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
123a0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
123b0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
123c0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
123d0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
123e0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
123f0 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
12400 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12410 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
12420 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  OP_NullRow ){.  
12430 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
12440 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
12450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12470 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
12480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65   */.  sqliteFree
12490 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
124a0 72 6e 3b 0a 7d 0a                                rn;.}.