/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4fecfccf8f35ec7b325d666f0cd2fb016a53da43:


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 33   where.c,v 1.193
0340: 20 32 30 30 36 2f 30 31 2f 31 30 20 31 37 3a 35   2006/01/10 17:5
0350: 38 3a 32 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:23 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 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  Data()->mallocFa
4ad0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
4ae0: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
4af0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4b00: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
4b10: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
4b20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  r->op==TK_IN ){.
4b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4b40: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
4b50: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
4b60: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
4b70: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4b80: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69  kSet, pExpr->pLi
4b90: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
4bb0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4bc0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4bd0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Expr->pSelect);.
4be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
4bf0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
4c00: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4c10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4c20: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
4c30: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
4c40: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4c50: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
4c60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
4c70: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
4c80: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
4c90: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d  rereqAll |= getM
4ca0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
4cb0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
4cc0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65  able);.  }.  pTe
4cd0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
4ce0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
4cf0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
4d00: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
4d10: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
4d20: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20  erm->operator = 
4d30: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
4d40: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
4d50: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4d60: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
4d70: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  t)==0 ){.    Exp
4d80: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
4d90: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70  ->pLeft;.    Exp
4da0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
4db0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
4dc0: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
4dd0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
4de0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
4df0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
4e00: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
4e10: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  >leftColumn = pL
4e20: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
4e30: 20 20 20 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61      pTerm->opera
4e40: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
4e50: 73 6b 28 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20  sk(pExpr->op);. 
4e60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
4e70: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
4e80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
4e90: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
4ea0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
4eb0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  r *pDup;.      i
4ec0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
4ed0: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
4ee0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
4ef0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
4f00: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
4f10: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  pr);.        idx
4f20: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
4f30: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
4f40: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
4f50: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
4f60: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
4f70: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
4f80: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
4f90: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
4fa0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
4fb0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
4fc0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
4fd0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
4fe0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
4ff0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
5000: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
5010: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
5020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5030: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
5040: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
5050: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
5060: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
5070: 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20  mute(pDup);.    
5080: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
5090: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
50a0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
50b0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
50c0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
50d0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
50e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
50f0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
5100: 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  = prereqLeft;.  
5110: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
5120: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
5130: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65  .      pNew->ope
5140: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
5150: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a  Mask(pDup->op);.
5160: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
5170: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
5180: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
5190: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
51a0: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
51b0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
51c0: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
51d0: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
51e0: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
51f0: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
5200: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
5210: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
5220: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
5230: 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78  ETWEEN ){.    Ex
5240: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5250: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
5260: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
5270: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
5280: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
5290: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
52a0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
52b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
52c0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
52d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
52e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
52f0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
5300: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
5310: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
5320: 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c  ite3Expr(ops[i],
5330: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5340: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20  pExpr->pLeft),. 
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5370: 74 65 33 45 78 70 72 44 75 70 28 70 4c 69 73 74  te3ExprDup(pList
5380: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30  ->a[i].pExpr), 0
5390: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
53a0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
53b0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
53c0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
53d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
53e0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
53f0: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
5400: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
5410: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
5420: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
5430: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5440: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
5450: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
5460: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
5470: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
5480: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
5490: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
54a0: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
54b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
54c0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
54d0: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65  Attempt to conve
54e0: 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  rt OR-connected 
54f0: 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e  terms into an IN
5500: 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61   operator so tha
5510: 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20  t.  ** they can 
5520: 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69  make use of indi
5530: 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20  ces.  Example:. 
5540: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
5550: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
5560: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
5570: 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  expr3.  **.  ** 
5580: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
5590: 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  o.  **.  **     
55a0: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
55b0: 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2f 0a 20  r2,expr3).  */. 
55c0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
55d0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
55e0: 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e    int ok;.    in
55f0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20  t i, j;.    int 
5600: 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72  iColumn, iCursor
5610: 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  ;.    WhereClaus
5620: 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65  e sOr;.    Where
5630: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a  Term *pOrTerm;..
5640: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
5650: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5660: 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a  _DYNAMIC)==0 );.
5670: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
5680: 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70  nit(&sOr, pWC->p
5690: 50 61 72 73 65 29 3b 0a 20 20 20 20 77 68 65 72  Parse);.    wher
56a0: 65 53 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78  eSplit(&sOr, pEx
56b0: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20  pr, TK_OR);.    
56c0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
56d0: 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26  Src, pMaskSet, &
56e0: 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sOr);.    assert
56f0: 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b  ( sOr.nTerm>0 );
5700: 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
5710: 64 6f 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  do{.      iColum
5720: 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66  n = sOr.a[j].lef
5730: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69  tColumn;.      i
5740: 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a  Cursor = sOr.a[j
5750: 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ].leftCursor;.  
5760: 20 20 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72      ok = iCursor
5770: 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >=0;.      for(i
5780: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
5790: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
57a0: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
57b0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
57c0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6f    if( pOrTerm->o
57d0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29  perator!=WO_EQ )
57e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
57f0: 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65   or_not_possible
5800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5810: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
5820: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
5830: 72 73 6f 72 20 26 26 20 70 4f 72 54 65 72 6d 2d  rsor && pOrTerm-
5840: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  >leftColumn==iCo
5850: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
5860: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
5870: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
5880: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5890: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67  ( (pOrTerm->flag
58a0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29  s & TERM_COPIED)
58b0: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
58c0: 20 20 20 20 20 20 20 20 20 20 20 28 28 70 4f 72             ((pOr
58d0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
58e0: 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 26  RM_VIRTUAL)!=0 &
58f0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
5900: 20 20 20 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f         (sOr.a[pO
5910: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e  rTerm->iParent].
5920: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
5930: 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  OK)!=0) ){.     
5940: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
5950: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
5960: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
5970: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20  e{.          ok 
5980: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
5990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
59a0: 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61  e( !ok && (sOr.a
59b0: 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45  [j++].flags & TE
59c0: 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26  RM_COPIED)!=0 &&
59d0: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
59e0: 20 20 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20      if( ok ){.  
59f0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
5a00: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  ist = 0;.      E
5a10: 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70  xpr *pNew, *pDup
5a20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f  ;.      for(i=sO
5a30: 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  r.nTerm-1, pOrTe
5a40: 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26  rm=sOr.a; i>=0 &
5a50: 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  & ok; i--, pOrTe
5a60: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
5a70: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  f( (pOrTerm->fla
5a80: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
5a90: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5aa0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
5ab0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
5ac0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
5ad0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
5ae0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5af0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69  prListAppend(pLi
5b00: 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20  st, pDup, 0);.  
5b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 75 70      }.      pDup
5b20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5b30: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  K_COLUMN, 0, 0, 
5b40: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
5b50: 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  up ){.        pD
5b60: 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 75  up->iTable = iCu
5b70: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 44  rsor;.        pD
5b80: 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  up->iColumn = iC
5b90: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  olumn;.      }. 
5ba0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
5bb0: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70  te3Expr(TK_IN, p
5bc0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
5bd0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
5be0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
5bf0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
5c00: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
5c10: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
5c20: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74       pNew->pList
5c30: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
5c40: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
5c50: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
5c60: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
5c70: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
5c80: 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  C);.        expr
5c90: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d  Analyze(pSrc, pM
5ca0: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78  askSet, pWC, idx
5cb0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
5cc0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
5cd0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
5ce0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
5cf0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
5d00: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
5d10: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
5d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5d40: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
5d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72        }.    }.or
5d60: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20  _not_possible:. 
5d70: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
5d80: 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23  ear(&sOr);.  }.#
5d90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5da0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
5db0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
5dc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5dd0: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
5de0: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
5df0: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
5e00: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
5e10: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
5e20: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
5e30: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b    */.  if( isLik
5e40: 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61  eOrGlob(pWC->pPa
5e50: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
5e60: 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f  &nPattern, &isCo
5e70: 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20 45  mplete) ){.    E
5e80: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
5e90: 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ght;.    Expr *p
5ea0: 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20  Str1, *pStr2;.  
5eb0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
5ec0: 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  1, *pNewExpr2;. 
5ed0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20     int idxNew1, 
5ee0: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
5ef0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  eft = pExpr->pLi
5f00: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
5f10: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
5f20: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
5f30: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31  pExpr;.    pStr1
5f40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5f50: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
5f60: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  0);.    if( pStr
5f70: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
5f80: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74  e3TokenCopy(&pSt
5f90: 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67  r1->token, &pRig
5fa0: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
5fb0: 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e    pStr1->token.n
5fc0: 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20   = nPattern;.   
5fd0: 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73   }.    pStr2 = s
5fe0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
5ff0: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 53  tr1);.    if( pS
6000: 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73 73  tr2 ){.      ass
6010: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
6020: 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b  n.dyn );.      +
6030: 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74  +*(u8*)&pStr2->t
6040: 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d  oken.z[nPattern-
6050: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  1];.    }.    pN
6060: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
6070: 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71 6c  3Expr(TK_GE, sql
6080: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
6090: 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  t), pStr1, 0);. 
60a0: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
60b0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
60c0: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
60d0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
60e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
60f0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
6100: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
6110: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
6120: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
6130: 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c  3Expr(TK_LT, sql
6140: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
6150: 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20  t), pStr2, 0);. 
6160: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
6170: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6180: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
6190: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
61a0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
61b0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
61c0: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
61d0: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
61e0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
61f0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
6200: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
6210: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
6220: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
6230: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
6240: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
6250: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
6260: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
6270: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
6280: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
6290: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
62a0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a  TIMIZATION */.}.
62b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
62c0: 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
62d0: 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
62e0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
62f0: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
6300: 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20  se.  If it can, 
6310: 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49  it returns 1.  I
6320: 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61  f pIdx cannot sa
6330: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44  tisfy the.** ORD
6340: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6360: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  ns 0..**.** pOrd
6370: 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52  erBy is an ORDER
6380: 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
6390: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
63a0: 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65  nt.  pTab is the
63b0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61  .** left-most ta
63c0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
63d0: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73  clause of that s
63e0: 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ame SELECT state
63f0: 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ment and.** the 
6400: 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73  table has a curs
6410: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61  or number of "ba
6420: 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e  se".  pIdx is an
6430: 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a   index on pTab..
6440: 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20  **.** nEqCol is 
6450: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6460: 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68  lumns of pIdx th
6470: 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65  at are used as e
6480: 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74  quality.** const
6490: 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20  raints.  Any of 
64a0: 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61  these columns ma
64b0: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  y be missing fro
64c0: 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  m the ORDER BY.*
64d0: 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  * clause and the
64e0: 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c   match can still
64f0: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
6500: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
6510: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
6520: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
6530: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
6540: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
6550: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
6560: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
6570: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
6580: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
6590: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
65a0: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
65b0: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
65c0: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
65d0: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
65e0: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
65f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
6600: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
6610: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
6620: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
6630: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
6640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6650: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
6660: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6680: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6690: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
66a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
66b0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
66c0: 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65  sting */.  Table
66d0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
66e0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
66f0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
6700: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
6710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
6720: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  sor number for p
6730: 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Tab */.  ExprLis
6740: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
6750: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
6760: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
6770: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
6780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6790: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
67a0: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
67b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
67c0: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
67d0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
67e0: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
67f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
6800: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
6810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6820: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
6830: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
6840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6850: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
6860: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
6870: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
6880: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
68b0: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
68c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
68d0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
68e0: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
68f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6900: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
6910: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6920: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
6930: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
6940: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
6950: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
6960: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
6970: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
6980: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6990: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
69a0: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
69b0: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
69c0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
69d0: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
69e0: 65 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  erm && i<pIdx->n
69f0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6a00: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
6a10: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
6a20: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
6a30: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
6a40: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6a50: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
6a60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
6a70: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
6a80: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
6a90: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
6aa0: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
6ab0: 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20  */..    pExpr = 
6ac0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
6ad0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
6ae0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
6af0: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
6b00: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  e ){.      /* Ca
6b10: 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64  n not use an ind
6b20: 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68  ex sort on anyth
6b30: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
6b40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  a column in the.
6b50: 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f        ** left-mo
6b60: 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  st table of the 
6b70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
6b80: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6b90: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
6ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6bb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
6bc0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
6bd0: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
6be0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6bf0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
6c00: 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn!=pIdx->aiColu
6c10: 6d 6e 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20  mn[i] || .      
6c20: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
6c30: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
6c40: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20  Idx->azColl[i]) 
6c50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  ){.      /* Term
6c60: 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20   j of the ORDER 
6c70: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
6c80: 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  ot match column 
6c90: 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  i of the index *
6ca0: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45  /.      if( i<nE
6cb0: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  qCol ){.        
6cc0: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6cd0: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f  olumn that is co
6ce0: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
6cf0: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
6d00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  n.        ** ORD
6d10: 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74  ER BY term, that
6d20: 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67   is OK.  Just ig
6d30: 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  nore that column
6d40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
6d50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6d60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6d80: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6d90: 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d  olumn fails to m
6da0: 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20  atch and is not 
6db0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
6dc0: 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  =.        ** the
6dd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  n the index cann
6de0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
6df0: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
6e00: 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
6e10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
6e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6e30: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
6e40: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
6e50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
6e60: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
6e70: 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74  0 || pTerm->sort
6e80: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
6e90: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
6ea0: 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c  ortOrder[i]==0 |
6eb0: 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
6ec0: 65 72 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20  er[i]==1 );.    
6ed0: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
6ee0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6ef0: 5b 69 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72  [i] ^ pTerm->sor
6f00: 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20  tOrder;.    if( 
6f10: 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i>nEqCol ){.    
6f20: 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72    if( termSortOr
6f30: 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29  der!=sortOrder )
6f40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
6f50: 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ices can only be
6f60: 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44   used if all ORD
6f70: 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74  ER BY terms past
6f80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
6f90: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6fa0: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74  ints are all eit
6fb0: 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e  her DESC or ASC.
6fc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
6fd0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
6ff0: 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53  ortOrder = termS
7000: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
7010: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65      j++;.    pTe
7020: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
7030: 54 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  The index can be
7040: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
7050: 67 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f  g if all terms o
7060: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7070: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63  lause.  ** are c
7080: 6f 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  overed..  */.  i
7090: 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20  f( j>=nTerm ){. 
70a0: 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74     *pbRev = sort
70b0: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65  Order!=0;.    re
70c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
70d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
70e0: 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20   Check table to 
70f0: 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52  see if the ORDER
7100: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f   BY clause in pO
7110: 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61  rderBy can be sa
7120: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f  tisfied.** by so
7130: 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f  rting in order o
7140: 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e  f ROWID.  Return
7150: 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20   true if so and 
7160: 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65  set *pbRev to be
7170: 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76  .** true for rev
7180: 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66  erse ROWID and f
7190: 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64  alse for forward
71a0: 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f   ROWID order..*/
71b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
71c0: 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69  ableByRowid(.  i
71d0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
71e0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
71f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
7200: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
7210: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
7220: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
7230: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7240: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  se */.  int *pbR
7250: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
7260: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
7270: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
7280: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
7290: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
72a0: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
72b0: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
72c0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20  Expr>0 );.  p = 
72d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
72e0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64  Expr;.  if( pOrd
72f0: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  erBy->nExpr==1 &
7300: 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  & p->op==TK_COLU
7310: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
7320: 3d 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  =base.          
7330: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  && p->iColumn==-
7340: 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  1 ){.    *pbRev 
7350: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
7360: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
7370: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
7380: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7390: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
73a0: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
73b0: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
73c0: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
73d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
73e0: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
73f0: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
7400: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
7410: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
7420: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
7430: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20  ming operatings 
7440: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
7450: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
7460: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
7470: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
7480: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
7490: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
74a0: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
74b0: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
74c0: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
74d0: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
74e0: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
74f0: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
7500: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
7510: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
7520: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
7530: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
7540: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
7550: 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63  est index for ac
7560: 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
7570: 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74  ular table.  Ret
7580: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7590: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66   to the index, f
75a0: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
75b0: 62 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78  be how the index
75c0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c   should be used,
75d0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
75e0: 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
75f0: 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20  raints, and the 
7600: 22 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20  "cost" for this 
7610: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
7620: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64   lowest cost ind
7630: 65 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f  ex wins.  The co
7640: 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  st is an estimat
7650: 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20  e of the amount 
7660: 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69  of.** CPU and di
7670: 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70  sk I/O need to p
7680: 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
7690: 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c  st using the sel
76a0: 65 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20  ected index..** 
76b0: 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
76c0: 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
76d0: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
76e0: 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
76f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
7700: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
7710: 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
7720: 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
7730: 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
7740: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
7750: 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
7760: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
7770: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
7780: 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
7790: 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
77a0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
77b0: 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
77c0: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
77d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
77e0: 65 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  e bestIndex(.  P
77f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7810: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7820: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
7830: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
7840: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
7850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
7860: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7870: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
7880: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
7890: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
78a0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
78c0: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
78d0: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
78e0: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
78f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
7900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
7910: 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
7920: 20 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65    Index **ppInde
7930: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
7940: 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70   Make *ppIndex p
7950: 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74  oint to the best
7960: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
7970: 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
7980: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66          /* Put f
7990: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
79a0: 74 68 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a  this choice in *
79b0: 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20  pFlags */.  int 
79c0: 2a 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20  *pnEq           
79d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74          /* Put t
79e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
79f0: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7a00: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57  s here */.){.  W
7a10: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
7a20: 0a 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64  .  Index *bestId
7a30: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  x = 0;         /
7a40: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76  * Index that giv
7a50: 65 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  es the lowest co
7a60: 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c  st */.  double l
7a70: 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20  owestCost;      
7a80: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
7a90: 6f 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78  of using bestIdx
7aa0: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c   */.  int bestFl
7ab0: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
7ac0: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
7ad0: 69 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49  iated with bestI
7ae0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  dx */.  int best
7af0: 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
7b00: 20 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75      /* Best valu
7b10: 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69  e for nEq */.  i
7b20: 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
7b30: 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
7b40: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
7b50: 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
7b60: 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
7b70: 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
7b80: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
7b90: 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
7ba0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76  ing */.  int rev
7bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7bc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7bd0: 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
7be0: 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  order */.  int f
7bf0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7c00: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
7c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7c20: 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20  pProbe */.  int 
7c30: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
7c40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7c50: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
7c60: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64  nstraints */.  d
7c70: 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7c90: 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
7ca0: 62 65 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28  be */..  TRACE((
7cb0: 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d  "bestIndex: tbl=
7cc0: 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e  %s notReady=%x\n
7cd0: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
7ce0: 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29  Name, notReady))
7cf0: 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ;.  lowestCost =
7d00: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
7d10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
7d20: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
7d30: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
7d40: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
7d50: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
7d60: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
7d70: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
7d80: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
7d90: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
7da0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
7db0: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a    *ppIndex = 0;.
7dc0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
7dd0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
7de0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f      if( pTerm->o
7df0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
7e00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ){.      /* Rowi
7e10: 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68  d== is always th
7e20: 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f  e best pick.  Lo
7e30: 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20  ok no further.  
7e40: 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20  Because only.   
7e50: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72     ** a single r
7e60: 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c  ow is generated,
7e70: 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61 79   output is alway
7e80: 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
7e90: 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61  r */.      *pFla
7ea0: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
7eb0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51  _EQ | WHERE_UNIQ
7ec0: 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20  UE;.      *pnEq 
7ed0: 3d 20 31 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 1;.      TRACE
7ee0: 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72  (("... best is r
7ef0: 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20  owid\n"));.     
7f00: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20   return 0.0;.   
7f10: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78 70   }else if( (pExp
7f20: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
7f30: 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20  )->pList!=0 ){. 
7f40: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e       /* Rowid IN
7f50: 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73   (LIST): cost is
7f60: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
7f70: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
7f80: 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c  list.      ** el
7f90: 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20  ements.  */.    
7fa0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70    lowestCost = p
7fb0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
7fc0: 70 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74  pr;.      lowest
7fd0: 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c  Cost *= estLog(l
7fe0: 6f 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20  owestCost);.    
7ff0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8000: 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54  Rowid IN (SELECT
8010: 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e  ): cost is NlogN
8020: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
8030: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
8040: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
8050: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e  esult of the inn
8060: 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68  er select.  We h
8070: 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73  ave no way to es
8080: 74 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  timate.      ** 
8090: 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61  that value so ma
80a0: 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e  ke a wild guess.
80b0: 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74   */.      lowest
80c0: 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20  Cost = 200;.    
80d0: 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  }.    TRACE(("..
80e0: 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a  . rowid IN cost:
80f0: 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74   %.9g\n", lowest
8100: 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Cost));.  }..  /
8110: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 63  * Estimate the c
8120: 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73  ost of a table s
8130: 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  can.  If we do n
8140: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79  ot know how many
8150: 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72  .  ** entries ar
8160: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  e in the table, 
8170: 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73  use 1 million as
8180: 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20   a guess..  */. 
8190: 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
81a0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
81b0: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20  cost = pProbe ? 
81c0: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
81d0: 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20  [0] : 1000000;. 
81e0: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62   TRACE(("... tab
81f0: 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73  le scan base cos
8200: 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  t: %.9g\n", cost
8210: 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48  ));.  flags = WH
8220: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
8230: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
8240: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
8250: 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64  a range of rowid
8260: 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61  s in a table sca
8270: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20  n..  */.  pTerm 
8280: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
8290: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
82a0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
82b0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
82c0: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
82d0: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
82e0: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
82f0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
8300: 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_LE, 0) ){.   
8310: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8320: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
8330: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
8340: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
8350: 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id<EXPR eliminat
8360: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72  es two-thirds or
8370: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
8380: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
8390: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
83a0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
83b0: 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_GE, 0) ){.    
83c0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
83d0: 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
83e0: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
83f0: 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
8400: 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d>EXPR eliminate
8410: 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20  s two-thirds of 
8420: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rows */.    }.  
8430: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f    TRACE(("... ro
8440: 77 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65  wid range reduce
8450: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
8460: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c  ", cost));.  }el
8470: 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  se{.    flags = 
8480: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
8490: 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64  the table scan d
84a0: 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20  oes not satisfy 
84b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
84c0: 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20  use, increase.  
84d0: 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e  ** the cost by N
84e0: 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68  logN to cover th
84f0: 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72  e expense of sor
8500: 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ting. */.  if( p
8510: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
8520: 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77  f( sortableByRow
8530: 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42  id(iCur, pOrderB
8540: 79 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20  y, &rev) ){.    
8550: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8560: 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52  _ORDERBY|WHERE_R
8570: 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20  OWID_RANGE;.    
8580: 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20    if( rev ){.   
8590: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
85a0: 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  ERE_REVERSE;.   
85b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
85c0: 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f        cost += co
85d0: 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b  st*estLog(cost);
85e0: 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e  .      TRACE((".
85f0: 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
8600: 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
8610: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
8620: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f    }.  }.  if( co
8630: 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b  st<lowestCost ){
8640: 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20  .    lowestCost 
8650: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74  = cost;.    best
8660: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
8670: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74   }..  /* Look at
8680: 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a   each index..  *
8690: 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
86a0: 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
86b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
86c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
86e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
86f0: 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70   double inMultip
8700: 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54  lier = 1;..    T
8710: 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78  RACE(("... index
8720: 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d   %s:\n", pProbe-
8730: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
8740: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
8750: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
8760: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
8770: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20 20  are satisfied.  
8780: 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63    ** by x=EXPR c
8790: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20  onstraints or x 
87a0: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
87b0: 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
87c0: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
87d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62  for(i=0; i<pProb
87e0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  e->nColumn; i++)
87f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
8800: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
8810: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  [i];.      pTerm
8820: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
8830: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
8840: 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
8850: 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20   pProbe);.      
8860: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
8870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67  reak;.      flag
8880: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
8890: 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
88a0: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
88b0: 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
88c0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
88d0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
88e0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
88f0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
8900: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
8910: 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  pr->pSelect!=0 )
8920: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
8930: 6c 74 69 70 6c 69 65 72 20 2a 3d 20 31 30 30 3b  ltiplier *= 100;
8940: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8950: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21  f( pExpr->pList!
8960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8970: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20  inMultiplier *= 
8980: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
8990: 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  xpr + 1;.       
89a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
89b0: 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  .    cost = pPro
89c0: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20  be->aiRowEst[i] 
89d0: 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a  * inMultiplier *
89e0: 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70   estLog(inMultip
89f0: 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d  lier);.    nEq =
8a00: 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   i;.    if( pPro
8a10: 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
8a20: 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26  None && (flags &
8a30: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
8a40: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
8a50: 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43   nEq==pProbe->nC
8a60: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66  olumn ){.      f
8a70: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
8a80: 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
8a90: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e  TRACE(("...... n
8aa0: 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39  Eq=%d inMult=%.9
8ab0: 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20  g cost=%.9g\n", 
8ac0: 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65  nEq, inMultiplie
8ad0: 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20  r, cost));..    
8ae0: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67  /* Look for rang
8af0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
8b00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71    */.    if( nEq
8b10: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
8b20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   ){.      int j 
8b30: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
8b40: 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70  mn[nEq];.      p
8b50: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
8b60: 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
8b70: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
8b80: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
8b90: 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20   pProbe);.      
8ba0: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
8bb0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8bc0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
8bd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  ;.        if( fi
8be0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8bf0: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
8c00: 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f  O_LT|WO_LE, pPro
8c10: 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
8c20: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
8c30: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
8c40: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a       cost /= 3;.
8c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8c60: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
8c70: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
8c80: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
8c90: 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  GE, pProbe) ){. 
8ca0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
8cb0: 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
8cc0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
8cd0: 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
8ce0: 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  }.        TRACE(
8cf0: 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72  ("...... range r
8d00: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
8d10: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
8d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8d30: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64     /* Add the ad
8d40: 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66  ditional cost of
8d50: 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74   sorting if that
8d60: 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20   is a factor..  
8d70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72    */.    if( pOr
8d80: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
8d90: 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
8da0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20  E_COLUMN_IN)==0 
8db0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 69 73  &&.           is
8dc0: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
8dd0: 72 73 65 2c 70 50 72 6f 62 65 2c 70 53 72 63 2d  rse,pProbe,pSrc-
8de0: 3e 70 54 61 62 2c 69 43 75 72 2c 70 4f 72 64 65  >pTab,iCur,pOrde
8df0: 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b  rBy,nEq,&rev) ){
8e00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
8e10: 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  gs==0 ){.       
8e20: 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
8e30: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
8e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8e50: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
8e60: 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20  ORDERBY;.       
8e70: 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20   if( rev ){.    
8e80: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
8e90: 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
8ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
8eb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73  lse{.        cos
8ec0: 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67  t += cost*estLog
8ed0: 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  (cost);.        
8ee0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f  TRACE(("...... o
8ef0: 72 64 65 72 62 79 20 69 6e 63 72 65 61 73 65 73  rderby increases
8f00: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
8f10: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
8f20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8f30: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
8f40: 77 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20  we can get away 
8f50: 77 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20  with using just 
8f60: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75  the index withou
8f70: 74 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65  t.    ** ever re
8f80: 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ading the table.
8f90: 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
8fa0: 20 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76   case, then halv
8fb0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  e the.    ** cos
8fc0: 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  t of this index.
8fd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8fe0: 66 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63  flags && pSrc->c
8ff0: 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d  olUsed < (((Bitm
9000: 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
9010: 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
9020: 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
9030: 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
9040: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
9050: 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   j<pProbe->nColu
9060: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
9070: 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65    int x = pProbe
9080: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
9090: 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
90a0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
90b0: 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
90c0: 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
90d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
90e0: 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
90f0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
9100: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
9110: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b        cost /= 2;
9120: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
9130: 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79  "...... idx-only
9140: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
9150: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
9180: 69 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76  index has achiev
9190: 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ed the lowest co
91a0: 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20  st so far, then 
91b0: 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
91c0: 20 20 20 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f     if( cost < lo
91d0: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
91e0: 20 20 62 65 73 74 49 64 78 20 3d 20 70 50 72 6f    bestIdx = pPro
91f0: 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74  be;.      lowest
9200: 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
9210: 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
9220: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 65 73  !=0 );.      bes
9230: 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
9240: 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20        bestNEq = 
9250: 6e 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nEq;.    }.  }..
9260: 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20    /* Report the 
9270: 62 65 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f  best result.  */
9280: 0a 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65  .  *ppIndex = be
9290: 73 74 49 64 78 3b 0a 20 20 54 52 41 43 45 28 28  stIdx;.  TRACE((
92a0: 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25  "best index is %
92b0: 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c  s, cost=%.9g, fl
92c0: 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e  ags=%x, nEq=%d\n
92d0: 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73 74 49  ",.        bestI
92e0: 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e  dx ? bestIdx->zN
92f0: 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20  ame : "(none)", 
9300: 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74  lowestCost, best
9310: 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29  Flags, bestNEq))
9320: 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65  ;.  *pFlags = be
9330: 73 74 46 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71  stFlags;.  *pnEq
9340: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65   = bestNEq;.  re
9350: 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b  turn lowestCost;
9360: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  .}.../*.** Disab
9370: 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
9380: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
9390: 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
93a0: 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
93b0: 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
93c0: 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
93d0: 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
93e0: 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
93f0: 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
9400: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
9410: 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
9420: 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
9430: 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
9440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
9450: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
9460: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9470: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
9480: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
9490: 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
94a0: 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
94b0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
94c0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
94d0: 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
94e0: 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
94f0: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
9500: 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
9510: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
9520: 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
9530: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
9540: 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
9550: 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
9560: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
9570: 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
9580: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
9590: 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
95a0: 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
95b0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
95c0: 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
95d0: 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
95e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
95f0: 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
9600: 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
9610: 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
9620: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
9630: 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
9640: 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
9650: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
9660: 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
9670: 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
9680: 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
9690: 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
96a0: 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
96b0: 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
96c0: 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
96d0: 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
96e0: 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
96f0: 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
9700: 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
9710: 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
9720: 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
9730: 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
9740: 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
9750: 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
9760: 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
9770: 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
9780: 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
9790: 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
97a0: 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
97b0: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
97c0: 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
97d0: 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
97e0: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
97f0: 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
9800: 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
9810: 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
9820: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
9830: 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
9840: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
9850: 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
9860: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
9870: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
9880: 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20  mJoin)).  ){.   
9890: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
98a0: 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
98b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
98c0: 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
98d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
98e0: 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
98f0: 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
9900: 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
9910: 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
9920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
9930: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
9940: 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
9950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
9960: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9970: 63 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64 73  code that builds
9980: 20 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20   a probe for an 
9990: 69 6e 64 65 78 2e 20 20 44 65 74 61 69 6c 73 3a  index.  Details:
99a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65  .**.**    *  Che
99b0: 63 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75  ck the top nColu
99c0: 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68  mn entries on th
99d0: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 61 6e 79  e stack.  If any
99e0: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 6f  .**       of tho
99f0: 73 65 20 65 6e 74 72 69 65 73 20 61 72 65 20 4e  se entries are N
9a00: 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  ULL, jump immedi
9a10: 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a  ately to brk,.**
9a20: 20 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20         which is 
9a30: 74 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73  the loop exit, s
9a40: 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e  ince no index en
9a50: 74 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a  try will match.*
9a60: 2a 20 20 20 20 20 20 20 69 66 20 61 6e 79 20 70  *       if any p
9a70: 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 69  art of the key i
9a80: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  s NULL..**.**   
9a90: 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20   *  Construct a 
9aa0: 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d  probe entry from
9ab0: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
9ac0: 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20   entries in.**  
9ad0: 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 77       the stack w
9ae0: 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20 61  ith affinities a
9af0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9b00: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
9b10: 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c 64 49  atic void buildI
9b20: 6e 64 65 78 50 72 6f 62 65 28 56 64 62 65 20 2a  ndexProbe(Vdbe *
9b30: 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  v, int nColumn, 
9b40: 69 6e 74 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a  int brk, Index *
9b50: 70 49 64 78 29 7b 0a 20 20 73 71 6c 69 74 65 33  pIdx){.  sqlite3
9b60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9b70: 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d  NotNull, -nColum
9b80: 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  n, sqlite3VdbeCu
9b90: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
9ba0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9bb0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
9bc0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71  Column, 0);.  sq
9bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9be0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72  , OP_Goto, 0, br
9bf0: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  k);.  sqlite3Vdb
9c00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
9c10: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
9c20: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  , 0);.  sqlite3I
9c30: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
9c40: 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a  v, pIdx);.}.../*
9c50: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9c60: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
9c70: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
9c80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9c90: 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
9ca0: 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
9cb0: 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
9cc0: 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
9cd0: 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
9ce0: 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
9cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
9d00: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
9d10: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
9d20: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
9d30: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
9d40: 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
9d50: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
9d60: 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
9d70: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
9d80: 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
9d90: 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
9da0: 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
9db0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
9dc0: 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
9dd0: 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
9de0: 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
9df0: 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
9e00: 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
9e10: 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
9e20: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75  tic void codeEqu
9e30: 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
9e40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9e50: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
9e60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
9e70: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
9e80: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
9e90: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9ea0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
9eb0: 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20    int brk,      
9ec0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
9ed0: 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68  re to abandon th
9ee0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  e loop */.  Wher
9ef0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
9f00: 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
9f10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9f20: 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
9f30: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
9f40: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
9f50: 70 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70  pr;.  if( pX->op
9f60: 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  !=TK_IN ){.    a
9f70: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
9f80: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69  K_EQ );.    sqli
9f90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9fa0: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
9fb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9fc0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
9fe0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49  Tab;.    int *aI
9ff0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  n;.    Vdbe *v =
a000: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a010: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
a020: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
a030: 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20  , pX);.    iTab 
a040: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
a050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a060: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
a070: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20   iTab, brk);.   
a080: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a090: 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73   "# %.*s", pX->s
a0a0: 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
a0b0: 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  z));.    pLevel-
a0c0: 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  >nIn++;.    sqli
a0d0: 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  te3ReallocOrFree
a0e0: 28 28 76 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c  ((void**)&pLevel
a0f0: 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  ->aInLoop,.     
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a120: 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f  of(pLevel->aInLo
a130: 6f 70 5b 30 5d 29 2a 33 2a 70 4c 65 76 65 6c 2d  op[0])*3*pLevel-
a140: 3e 6e 49 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d  >nIn);.    aIn =
a150: 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70   pLevel->aInLoop
a160: 3b 0a 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b  ;.    if( aIn ){
a170: 0a 20 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c  .      aIn += pL
a180: 65 76 65 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b  evel->nIn*3 - 3;
a190: 0a 20 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20  .      aIn[0] = 
a1a0: 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 61  OP_Next;.      a
a1b0: 49 6e 5b 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20  In[1] = iTab;.  
a1c0: 20 20 20 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c      aIn[2] = sql
a1d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a1e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
a1f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
a200: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  .      pLevel->n
a210: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
a220: 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
a230: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
a240: 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Term);.}../*.** 
a250: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
a260: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
a270: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
a280: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
a290: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65  n.** index.  The
a2a0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
a2b0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
a2c0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
a2d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  k..**.** For exa
a2e0: 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
a2f0: 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
a300: 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
a310: 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
a320: 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
a330: 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
a340: 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
a350: 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
a360: 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
a370: 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
a380: 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
a390: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
a3a0: 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
a3b0: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
a3c0: 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
a3d0: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
a3e0: 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
a3f0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
a400: 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
a410: 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
a420: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
a430: 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
a440: 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
a450: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
a460: 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
a470: 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20  l be left.** on 
a480: 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73  the stack - a is
a490: 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64   the deepest and
a4a0: 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73   b the shallowes
a4b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  t..**.** In the 
a4c0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
a4d0: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
a4e0: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
a4f0: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
a500: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
a510: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
a520: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
a530: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
a540: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
a550: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
a560: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
a570: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
a580: 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
a590: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
a5a0: 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
a5b0: 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
a5c0: 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74  ll and puts.** t
a5d0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
a5e0: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
a5f0: 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20  n pLevel->iMem. 
a600: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
a610: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
a620: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c  tine will use pL
a630: 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74  evel->iMem to st
a640: 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
a650: 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
a660: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
a670: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
a680: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
a690: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
a6a0: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
a6b0: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
a6c0: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
a6d0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
a6e0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
a6f0: 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61  void codeAllEqua
a700: 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
a710: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a720: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a730: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
a740: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
a750: 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
a760: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
a770: 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
a780: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
a790: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
a7a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a7b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
a7c0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69  eady,     /* Whi
a7d0: 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d  ch parts of FROM
a7e0: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
a7f0: 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  en coded */.  in
a800: 74 20 62 72 6b 20 20 20 20 20 20 20 20 20 20 20  t brk           
a810: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
a820: 20 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70   to end the loop
a830: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
a840: 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20   = pLevel->nEq; 
a850: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
a860: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
a870: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
a880: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
a890: 72 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20  rmsInMem = 0;   
a8a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
a8b0: 75 65 2c 20 73 74 6f 72 65 20 76 61 6c 75 65 20  ue, store value 
a8c0: 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a  in mem[] cells *
a8d0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
a8e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
a8f0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
a900: 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
a910: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
a920: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
a930: 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f  Level->pIdx;   /
a940: 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
a950: 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
a960: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  loop */.  int iC
a970: 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
a980: 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  bCur;   /* The c
a990: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
a9a0: 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  le */.  WhereTer
a9b0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
a9c0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
a9d0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
a9e0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  m */.  int j;   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
aa10: 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  nter */..  /* Fi
aa20: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
aa30: 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
aa40: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
aa50: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
aa60: 20 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e    ** We always n
aa70: 65 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  eed at least one
aa80: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
aa90: 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  he loop terminat
aaa0: 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  or.  ** value.  
aab0: 49 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20  If there are IN 
aac0: 6f 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20  operators we'll 
aad0: 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63  need one for eac
aae0: 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20  h == or.  ** IN 
aaf0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
ab00: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  .  pLevel->iMem 
ab10: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
ab20: 3b 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ;.  if( pLevel->
ab30: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
ab40: 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70  LUMN_IN ){.    p
ab50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
ab60: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20  Level->nEq;.    
ab70: 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a  termsInMem = 1;.
ab80: 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
ab90: 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
aba0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
abb0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49  .  for(j=0; j<pI
abc0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
abd0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70  ){.    int k = p
abe0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
abf0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
ac00: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
ac10: 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , k, notReady, W
ac20: 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78  O_EQ|WO_IN, pIdx
ac30: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
ac40: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ac50: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
ac60: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
ac70: 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63  DED)==0 );.    c
ac80: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
ac90: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62  pParse, pTerm, b
aca0: 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  rk, pLevel);.   
acb0: 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20   if( termsInMem 
acc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
acd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ace0: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
acf0: 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a  ->iMem+j+1, 1);.
ad00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
ad10: 72 74 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20  rt( j==nEq );.. 
ad20: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
ad30: 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  l the constraint
ad40: 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74   values are on t
ad50: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
ad60: 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74  ack.  */.  if( t
ad70: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
ad80: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
ad90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
ada0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
adb0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65   OP_MemLoad, pLe
adc0: 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30  vel->iMem+j+1, 0
add0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
ade0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
adf0: 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
ae00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
ae10: 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
ae20: 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
ae30: 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
ae40: 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
ae50: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
ae60: 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
ae70: 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
ae80: 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
ae90: 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
aea0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
aeb0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
aec0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
aed0: 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
aee0: 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
aef0: 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
af00: 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
af10: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
af20: 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
af30: 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af50: 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
af60: 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
af70: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
af80: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a  LITE_TEST */....
af90: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
afa0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
afb0: 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
afc0: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
afd0: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
afe0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
aff0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b000: 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
b010: 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
b020: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
b030: 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
b040: 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
b050: 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
b060: 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
b070: 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
b080: 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
b090: 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
b0a0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
b0b0: 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
b0c0: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
b0d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
b0e0: 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
b0f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b100: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
b110: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
b120: 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
b130: 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
b140: 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
b150: 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
b160: 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
b170: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
b180: 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
b190: 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
b1a0: 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
b1b0: 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
b1c0: 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
b1d0: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
b1e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
b1f0: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
b200: 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
b210: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
b220: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
b230: 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
b240: 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
b250: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
b260: 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
b270: 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
b280: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
b290: 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
b2a0: 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
b2b0: 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
b2c0: 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
b2d0: 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
b2e0: 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
b2f0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
b300: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
b310: 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
b320: 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
b330: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
b340: 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
b360: 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
b370: 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
b3a0: 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
b3b0: 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
b3e0: 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
b3f0: 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
b400: 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
b410: 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
b420: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
b430: 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
b440: 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
b450: 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
b460: 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
b470: 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
b480: 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
b490: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
b4a0: 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
b4b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
b4c0: 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
b4d0: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
b4e0: 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
b4f0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
b500: 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
b510: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
b520: 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
b530: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
b540: 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
b550: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
b560: 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
b570: 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
b580: 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
b590: 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
b5a0: 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
b5b0: 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
b5c0: 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
b5d0: 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
b5e0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
b5f0: 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
b600: 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
b610: 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
b620: 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
b630: 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
b640: 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
b650: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
b660: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
b670: 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
b680: 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
b690: 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
b6a0: 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
b6b0: 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
b6c0: 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
b6d0: 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
b6e0: 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
b6f0: 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
b700: 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
b710: 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
b720: 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
b730: 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
b740: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
b750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
b760: 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
b770: 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
b780: 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
b790: 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
b7a0: 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
b7b0: 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
b7c0: 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
b7d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
b7e0: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
b7f0: 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
b800: 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
b810: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
b820: 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
b830: 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
b840: 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
b850: 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
b860: 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
b870: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
b880: 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
b890: 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
b8a0: 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
b8b0: 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
b8c0: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
b8d0: 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
b8e0: 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
b8f0: 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
b900: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
b910: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
b920: 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
b930: 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
b940: 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
b950: 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
b960: 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
b970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
b980: 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
b990: 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
b9a0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
b9b0: 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
b9c0: 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
b9d0: 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
b9e0: 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
b9f0: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
ba00: 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
ba10: 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
ba20: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
ba30: 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
ba40: 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
ba50: 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
ba60: 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
ba70: 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
ba80: 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
ba90: 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
baa0: 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
bab0: 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
bac0: 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
bad0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bae0: 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
baf0: 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
bb00: 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
bb10: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
bb20: 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
bb30: 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
bb40: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
bb50: 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
bb60: 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
bb70: 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
bb80: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
bb90: 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
bba0: 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
bbb0: 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
bbc0: 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
bbd0: 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
bbe0: 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
bbf0: 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
bc00: 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
bc10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
bc20: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
bc30: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
bc40: 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
bc50: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
bc60: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
bc70: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
bc80: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
bc90: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
bca0: 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
bcb0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
bcc0: 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
bcd0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
bce0: 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
bcf0: 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
bd00: 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
bd10: 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
bd20: 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
bd30: 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
bd40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
bd50: 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
bd60: 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
bd70: 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
bd80: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
bd90: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
bda0: 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
bdb0: 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
bdc0: 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
bdd0: 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
bde0: 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
bdf0: 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
be00: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
be10: 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
be20: 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
be30: 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
be40: 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
be50: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
be60: 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
be70: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
be80: 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
be90: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
bea0: 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
beb0: 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
bec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
bed0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
bee0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
bef0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
bf00: 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
bf10: 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
bf20: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
bf30: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
bf40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
bf50: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
bf60: 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
bf70: 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy  /* An ORDER
bf80: 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
bf90: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
bfa0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bfb0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
bfc0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72  ounter */.  Wher
bfd0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
bfe0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
bff0: 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
c000: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
c010: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
c020: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c030: 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
c040: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
c050: 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  engine */.  int 
c060: 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20  brk, cont = 0;  
c070: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
c080: 73 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 20  ses used during 
c090: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
c0a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
c0b0: 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
c0c0: 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
c0d0: 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
c0e0: 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
c0f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
c100: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
c110: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  le term in the W
c120: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
c130: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73   ExprMaskSet mas
c140: 6b 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  kSet;       /* T
c150: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
c160: 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
c170: 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
c180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
c190: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69  ERE clause is di
c1a0: 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65  vided into these
c1b0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75   terms */.  stru
c1c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
c1d0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41  *pTabItem;  /* A
c1e0: 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72   single entry fr
c1f0: 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  om pTabList */. 
c200: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
c210: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
c220: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
c230: 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f  el in the pWInfo
c240: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
c250: 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
c260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c270: 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
c280: 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
c290: 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
c2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c2b0: 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
c2c0: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61  tion of all wc.a
c2d0: 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f  [].flags */..  /
c2e0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c2f0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
c300: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
c310: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
c320: 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
c330: 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
c340: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
c350: 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
c360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c370: 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
c380: 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
c390: 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
c3a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c3b0: 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  }..  /* Split th
c3c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
c3d0: 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
c3e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
c3f0: 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
c400: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
c410: 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
c420: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
c430: 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d    initMaskSet(&m
c440: 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
c450: 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20  ClauseInit(&wc, 
c460: 70 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72 65  pParse);.  where
c470: 53 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72  Split(&wc, pWher
c480: 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
c490: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
c4a0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
c4b0: 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
c4c0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
c4d0: 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
c4e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20  return value..  
c4f0: 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  */.  pWInfo = sq
c500: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
c510: 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20  of(WhereInfo) + 
c520: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73  pTabList->nSrc*s
c530: 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
c540: 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
c550: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d  3ThreadData()->m
c560: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c570: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
c580: 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70  inNoMem;.  }.  p
c590: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
c5a0: 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
c5b0: 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
c5c0: 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
c5d0: 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
c5e0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c5f0: 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  );..  /* Special
c600: 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
c610: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
c620: 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
c630: 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
c640: 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
c650: 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
c660: 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
c670: 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
c680: 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70  if( pWhere && (p
c690: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30  TabList->nSrc==0
c6a0: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
c6b0: 73 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  sConstant(pWhere
c6c0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
c6d0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
c6e0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
c6f0: 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b  nfo->iBreak, 1);
c700: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
c710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
c720: 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
c730: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
c740: 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
c750: 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
c760: 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
c770: 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
c780: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
c790: 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
c7a0: 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
c7b0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
c7c0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
c7d0: 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
c7e0: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
c7f0: 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
c800: 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
c810: 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
c820: 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
c830: 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  cessed..  */.  f
c840: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
c850: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
c860: 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26      createMask(&
c870: 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  maskSet, pTabLis
c880: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
c890: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c  ;.  }.  exprAnal
c8a0: 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
c8b0: 20 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b   &maskSet, &wc);
c8c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 68  .  if( sqlite3Th
c8d0: 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c  readData()->mall
c8e0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c8f0: 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
c900: 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oMem;.  }..  /* 
c910: 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
c920: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
c930: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
c940: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
c950: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
c960: 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
c970: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
c980: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
c990: 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
c9a0: 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
c9b0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
c9c0: 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
c9d0: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
c9e0: 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48  a[].flags     WH
c9f0: 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
ca00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
ca10: 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
ca20: 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
ca30: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
ca40: 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
ca50: 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
ca60: 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
ca70: 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68   When term of th
ca80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
ca90: 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
caa0: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
cab0: 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
cac0: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
cad0: 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
cae0: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
caf0: 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
cb00: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
cb10: 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
cb20: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
cb30: 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
cb40: 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
cb50: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
cb60: 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
cb70: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
cb80: 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
cb90: 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
cba0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
cbb0: 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
cbc0: 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
cbd0: 3d 20 7e 30 3b 0a 20 20 54 52 41 43 45 28 28 22  = ~0;.  TRACE(("
cbe0: 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
cbf0: 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
cc00: 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
cc10: 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
cc20: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
cc30: 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
cc40: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
cc50: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
cc60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
cc70: 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
cc80: 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
cc90: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
cca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
ccb0: 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77  gs asssociated w
ccc0: 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  ith pIdx */.    
ccd0: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ccf0: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
cd00: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
cd10: 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
cd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd30: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72   /* The cost for
cd40: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
cd50: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
cd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
cd70: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
cd80: 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
cd90: 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
cda0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
cdb0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65  he best index se
cdc0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
cdd0: 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
cde0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
cdf0: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
ce00: 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
ce10: 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d     int bestNEq =
ce20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
ce30: 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64  * nEq associated
ce40: 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
ce50: 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74     double lowest
ce60: 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
ce70: 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42  * Cost of the pB
ce80: 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
ce90: 65 73 74 4a 3b 20 20 20 20 20 20 20 20 20 20 20  estJ;           
cea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
ceb0: 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
cec0: 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cee0: 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
cef0: 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 0a   j or bestJ */..
cf00: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
cf10: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
cf20: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
cf30: 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
cf40: 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
cf50: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
cf60: 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
cf70: 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
cf80: 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
cf90: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
cfa0: 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
cfb0: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
cfc0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
cfd0: 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
cfe0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
cff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
d000: 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28  ost = bestIndex(
d010: 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61  pParse, &wc, pTa
d020: 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
d030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d040: 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26          (i==0 &&
d050: 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70   ppOrderBy) ? *p
d060: 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20  pOrderBy : 0,.  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61       &pIdx, &fla
d090: 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20  gs, &nEq);.     
d0a0: 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
d0b0: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
d0c0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
d0d0: 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  t;.        pBest
d0e0: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
d0f0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
d100: 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  gs;.        best
d110: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  NEq = nEq;.     
d120: 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
d130: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d140: 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
d150: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
d160: 54 5f 43 52 4f 53 53 29 29 21 3d 30 0a 20 20 20  T_CROSS))!=0.   
d170: 20 20 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26        || (j>0 &&
d180: 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a   (pTabItem[-1].j
d190: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
d1a0: 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
d1b0: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
d1c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d1d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  }.    }.    TRAC
d1e0: 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
d1f0: 72 20 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25  r choose table %
d200: 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22  d for loop %d\n"
d210: 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20  , bestJ,.       
d220: 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66      pLevel-pWInf
d230: 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20  o->a));.    if( 
d240: 28 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45  (bestFlags & WHE
d250: 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29  RE_ORDERBY)!=0 )
d260: 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  {.      *ppOrder
d270: 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
d280: 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
d290: 73 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  stFlags;.    pLe
d2a0: 76 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73  vel->flags = bes
d2b0: 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
d2c0: 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74  el->pIdx = pBest
d2d0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45  ;.    pLevel->nE
d2e0: 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20  q = bestNEq;.   
d2f0: 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70   pLevel->aInLoop
d300: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c   = 0;.    pLevel
d310: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69  ->nIn = 0;.    i
d320: 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
d330: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
d340: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
d350: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
d360: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
d370: 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
d380: 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
d390: 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
d3a0: 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
d3b0: 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
d3c0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
d3d0: 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a  om = bestJ;.  }.
d3e0: 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70    TRACE(("*** Op
d3f0: 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
d400: 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a   ***\n"));..  /*
d410: 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
d420: 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
d430: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
d440: 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
d450: 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
d460: 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
d470: 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
d480: 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
d490: 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
d4a0: 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
d4b0: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
d4c0: 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
d4d0: 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
d4e0: 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
d4f0: 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
d500: 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
d510: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
d520: 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
d530: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
d540: 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
d550: 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
d560: 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
d570: 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
d580: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
d590: 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
d5a0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
d5b0: 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
d5c0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
d5d0: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
d5e0: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
d5f0: 49 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20  Index *pIx;     
d600: 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
d610: 6f 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69  o access pTab (i
d620: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e  f any) */.    in
d630: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
d640: 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
d650: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
d660: 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
d670: 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
d680: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
d690: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d6a0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
d6b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
d6c0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
d6d0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
d6e0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
d6f0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
d700: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
d710: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
d720: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
d730: 65 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45  e3MPrintf("TABLE
d740: 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
d750: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
d760: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
d770: 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
d780: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
d790: 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  z AS %s", zMsg, 
d7a0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
d7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d7c0: 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
d7d0: 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
d7e0: 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
d7f0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57  te3MPrintf("%z W
d800: 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a  ITH INDEX %s", z
d810: 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  Msg, pIx->zName)
d820: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d830: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
d840: 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
d850: 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
d860: 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NGE) ){.        
d870: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
d880: 72 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20  rintf("%z USING 
d890: 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
d8a0: 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
d8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d8c0: 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  3(v, OP_Explain,
d8d0: 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
d8e0: 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41  m, zMsg, P3_DYNA
d8f0: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  MIC);.    }.#end
d900: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d910: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20  T_EXPLAIN */.   
d920: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
d930: 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
d940: 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
d950: 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
d960: 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
d970: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
d980: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
d990: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
d9a0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
d9b0: 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62  ransient || pTab
d9c0: 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
d9d0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
d9e0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
d9f0: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
da00: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
da10: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
da20: 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
da30: 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
da40: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
da50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da60: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
da70: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
da80: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
da90: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
daa0: 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  }.    pLevel->iT
dab0: 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d  abCur = pTabItem
dac0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69  ->iCursor;.    i
dad0: 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c  f( (pIx = pLevel
dae0: 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20  ->pIdx)!=0 ){.  
daf0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
db00: 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
db10: 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
db20: 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pIx);.      asse
db30: 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
db40: 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
db50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
db70: 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
db80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
db90: 65 6e 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20  ent((v, "# %s", 
dba0: 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
dbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
dbc0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
dbd0: 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  d, iIdxCur, pIx-
dbe0: 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
dc00: 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49  r*)pKey, P3_KEYI
dc10: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
dc20: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65    }.    if( (pLe
dc30: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
dc40: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
dc50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dc70: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
dc80: 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f  IdxCur, pIx->nCo
dc90: 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  lumn+1);.    }. 
dca0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
dcb0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
dcc0: 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
dcd0: 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
dce0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dcf0: 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47  Addr(v);..  /* G
dd00: 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
dd10: 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
dd20: 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
dd30: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
dd40: 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
dd50: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
dd60: 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
dd70: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
dd80: 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
dd90: 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
dda0: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
ddb0: 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
ddc0: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
ddd0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
dde0: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
ddf0: 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69  int j;.    int i
de00: 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
de10: 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65  iCursor;  /* The
de20: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
de30: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
de40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
de50: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
de60: 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
de70: 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
de80: 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  dxCur;       /* 
de90: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
dea0: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
deb0: 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  .    int omitTab
dec0: 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  le;     /* True 
ded0: 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
dee0: 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20  dex only */.    
def0: 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
df00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
df10: 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
df20: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
df30: 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  /..    pTabItem 
df40: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
df50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
df60: 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74     iCur = pTabIt
df70: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
df80: 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
df90: 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75  pIdx;.    iIdxCu
dfa0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
dfb0: 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  Cur;.    bRev = 
dfc0: 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
dfd0: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
dfe0: 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c  =0;.    omitTabl
dff0: 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  e = (pLevel->fla
e000: 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
e010: 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  NLY)!=0;..    /*
e020: 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
e030: 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
e040: 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
e050: 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a  structions.    *
e060: 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
e070: 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
e080: 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75   brk to break ou
e090: 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20  t of a loop..   
e0a0: 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
e0b0: 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
e0c0: 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
e0d0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
e0e0: 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
e0f0: 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c   */.    brk = pL
e100: 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69  evel->brk = sqli
e110: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e120: 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20  (v);.    cont = 
e130: 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73  pLevel->cont = s
e140: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e150: 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
e160: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
e170: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
e180: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
e190: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
e1a0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
e1b0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
e1c0: 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
e1d0: 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
e1e0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20   any.    ** row 
e1f0: 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
e200: 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
e210: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
e220: 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
e230: 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a   (pTabItem[-1].j
e240: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
e250: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  T)!=0 ){.      i
e260: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  f( !pParse->nMem
e270: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   ) pParse->nMem+
e280: 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  +;.      pLevel-
e290: 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61  >iLeftJoin = pPa
e2a0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
e2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2c0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
e2d0: 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
e2e0: 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56  ftJoin);.      V
e2f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e300: 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e  # init LEFT JOIN
e310: 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
e320: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e330: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
e340: 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
e350: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
e360: 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 1:  We can dir
e370: 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
e380: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
e390: 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20  ng an.      **  
e3a0: 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
e3b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
e3c0: 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
e3d0: 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a  eld.  Or.      *
e3e0: 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
e3f0: 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
e400: 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
e410: 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
e420: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
e430: 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20   construct..    
e440: 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d    */.      pTerm
e450: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
e460: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
e470: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
e480: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
e490: 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
e4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e4b0: 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
e4c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e4d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
e4e0: 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
e4f0: 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
e500: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  e==0 );.      co
e510: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
e520: 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72  Parse, pTerm, br
e530: 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  k, pLevel);.    
e540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e550: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
e560: 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20  nt, 1, brk);.   
e570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e580: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  dOp(v, OP_NotExi
e590: 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  sts, iCur, brk);
e5a0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
e5b0: 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
e5c0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
e5d0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
e5e0: 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
e5f0: 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
e600: 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
e610: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
e620: 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
e630: 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
e640: 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
e650: 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  ID field..      
e660: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
e670: 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
e680: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
e690: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
e6a0: 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a  *pStart, *pEnd;.
e6b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
e6c0: 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
e6d0: 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69       pStart = fi
e6e0: 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
e6f0: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
e700: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
e710: 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69  .      pEnd = fi
e720: 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
e730: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
e740: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b  WO_LT|WO_LE, 0);
e750: 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
e760: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
e770: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
e780: 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
e790: 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d  ;.        pEnd =
e7a0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
e7b0: 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
e7d0: 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58   *pX;.        pX
e7e0: 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
e7f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e800: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
e810: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
e820: 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  t->leftCursor==i
e830: 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Cur );.        s
e840: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e850: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
e860: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
e870: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e880: 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d  OP_ForceInt, pX-
e890: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58  >op==TK_LE || pX
e8a0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b  ->op==TK_GT, brk
e8b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e8c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62  e3VdbeAddOp(v, b
e8d0: 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20  Rev ? OP_MoveLt 
e8e0: 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  : OP_MoveGe, iCu
e8f0: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
e900: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e910: 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20   "pk"));.       
e920: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
e930: 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  vel, pStart);.  
e940: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e960: 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  dOp(v, bRev ? OP
e970: 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
e980: 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  d, iCur, brk);. 
e990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e9a0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   pEnd ){.       
e9b0: 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
e9c0: 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
e9d0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
e9e0: 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
e9f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
ea00: 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
ea10: 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iCur );.        
ea20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ea30: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
ea40: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  ht);.        pLe
ea50: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
ea60: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
ea70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
ea90: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
eaa0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  m, 1);.        i
eab0: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
eac0: 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
ead0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  T ){.          t
eae0: 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
eaf0: 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
eb00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eb10: 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
eb20: 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
eb30: 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  P_Gt;.        }.
eb40: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
eb50: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
eb60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eb70: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
eb80: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
eb90: 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v);.      pLevel
eba0: 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
ebb0: 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
ebc0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
ebd0: 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
ebe0: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
ebf0: 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  rt;.      if( te
ec00: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
ec10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ec20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec30: 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b  Rowid, iCur, 0);
ec40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ec50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec60: 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
ec70: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
ec80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ec90: 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 53  dOp(v, testOp, S
eca0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
ecb0: 43 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  C, brk);.      }
ecc0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
ecd0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
ece0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
ecf0: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  E ){.      /* Ca
ed00: 73 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20  se 3: The WHERE 
ed10: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
ed20: 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72   refers to the r
ed30: 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  ight-most.      
ed40: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
ed50: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  n of the index i
ed60: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
ed70: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
ed80: 66 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  f.      **      
ed90: 20 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20     the index is 
eda0: 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74  on (x,y,z) and t
edb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
edc0: 69 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  is of the.      
edd0: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20  **         form 
ede0: 22 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74  "x=5 AND y<10" t
edf0: 68 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73  hen this case is
ee00: 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65   used.  Only the
ee10: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
ee20: 20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c    right-most col
ee30: 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
ee40: 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
ee50: 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  est must.      *
ee60: 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
ee70: 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
ee80: 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20  operators..     
ee90: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
eea0: 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
eeb0: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
eec0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
eed0: 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ERE clause.     
eee0: 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
eef0: 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
ef00: 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
ef10: 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
ef20: 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
ef30: 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
ef40: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
ef50: 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
ef60: 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f  DER BY..      */
ef70: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
ef80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  ;.      int nEq 
ef90: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
efa0: 20 20 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30       int topEq=0
efb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
efc0: 20 69 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73   if top limit us
efd0: 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20  es ==. False is 
efe0: 73 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20  strictly < */.  
eff0: 20 20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b      int btmEq=0;
f000: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f010: 69 66 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65  if btm limit use
f020: 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73  s ==. False if s
f030: 74 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20  trictly > */.   
f040: 20 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74     int topOp, bt
f050: 6d 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74  mOp;   /* Operat
f060: 6f 72 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20  ors for the top 
f070: 61 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63  and bottom searc
f080: 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  h bounds */.    
f090: 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20    int testOp;.  
f0a0: 20 20 20 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c      int nNotNull
f0b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
f0c0: 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 69 6e 64  r of rows of ind
f0d0: 65 78 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ex that must be 
f0e0: 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  non-NULL */.    
f0f0: 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d    int topLimit =
f100: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
f110: 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
f120: 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74  T)!=0;.      int
f130: 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65   btmLimit = (pLe
f140: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
f150: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
f160: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
f170: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
f180: 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
f190: 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
f1a0: 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20   == or IN.      
f1b0: 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65  ** and level the
f1c0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
f1d0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74   terms on the st
f1e0: 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
f1f0: 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c      codeAllEqual
f200: 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
f210: 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f   pLevel, &wc, no
f220: 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20  tReady, brk);.. 
f230: 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74       /* Duplicat
f240: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  e the equality t
f250: 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75  erm values becau
f260: 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  se they will all
f270: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   be.      ** use
f280: 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f  d twice: once to
f290: 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e   make the termin
f2a0: 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e  ation key and on
f2b0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20  ce to make the. 
f2c0: 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65       ** start ke
f2d0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
f2e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
f2f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
f300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f310: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d  (v, OP_Dup, nEq-
f320: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  1, 0);.      }..
f330: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
f340: 6f 75 74 20 77 68 61 74 20 63 6f 6d 70 61 72 69  out what compari
f350: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 6f  son operators to
f360: 20 75 73 65 20 66 6f 72 20 74 6f 70 20 61 6e 64   use for top and
f370: 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a   bottom .      *
f380: 2a 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 2e  * search bounds.
f390: 20 46 6f 72 20 61 6e 20 61 73 63 65 6e 64 69 6e   For an ascendin
f3a0: 67 20 69 6e 64 65 78 2c 20 74 68 65 20 62 6f 74  g index, the bot
f3b0: 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61 20 3e  tom bound is a >
f3c0: 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20   or >=.      ** 
f3d0: 6f 70 65 72 61 74 6f 72 20 61 6e 64 20 74 68 65  operator and the
f3e0: 20 74 6f 70 20 62 6f 75 6e 64 20 69 73 20 61 20   top bound is a 
f3f0: 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72  < or <= operator
f400: 2e 20 20 46 6f 72 20 61 20 64 65 73 63 65 6e 64  .  For a descend
f410: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64  ing.      ** ind
f420: 65 78 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  ex the operators
f430: 20 61 72 65 20 72 65 76 65 72 73 65 64 2e 0a 20   are reversed.. 
f440: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e       */.      nN
f450: 6f 74 4e 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74  otNull = nEq + t
f460: 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 69  opLimit;.      i
f470: 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  f( pIdx->aSortOr
f480: 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
f490: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
f4a0: 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54     topOp = WO_LT
f4b0: 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
f4c0: 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f  btmOp = WO_GT|WO
f4d0: 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _GE;.      }else
f4e0: 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20  {.        topOp 
f4f0: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
f500: 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57         btmOp = W
f510: 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20  O_LT|WO_LE;.    
f520: 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f      SWAP(int, to
f530: 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74  pLimit, btmLimit
f540: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
f550: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
f560: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
f570: 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
f580: 6b 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20  key value that. 
f590: 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64       ** will end
f5a0: 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68   the search.  Th
f5b0: 65 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e  ere is no termin
f5c0: 61 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65  ation key if the
f5d0: 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20  re.      ** are 
f5e0: 6e 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  no equality term
f5f0: 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22  s and no "X<..."
f600: 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a   term..      **.
f610: 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65        ** 2002-De
f620: 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72  c-04: On a rever
f630: 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74  se-order scan, t
f640: 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65  he so-called "te
f650: 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20  rmination".     
f660: 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64   ** key computed
f670: 20 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64   here really end
f680: 73 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73  s up being the s
f690: 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20  tart key..      
f6a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70  */.      if( top
f6b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
f6c0: 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
f6d0: 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
f6e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
f6f0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
f700: 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
f710: 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74  , k, notReady, t
f720: 6f 70 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20  opOp, pIdx);.   
f730: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
f740: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  rm!=0 );.       
f750: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
f760: 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
f770: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
f780: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
f790: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
f7a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f7b0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
f7c0: 29 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71  );.        topEq
f7d0: 20 3d 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74   = pTerm->operat
f7e0: 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
f7f0: 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  E);.        disa
f800: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
f810: 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
f820: 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47  testOp = OP_IdxG
f830: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
f840: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
f850: 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47   nEq>0 ? OP_IdxG
f860: 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  E : OP_Noop;.   
f870: 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a       topEq = 1;.
f880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f890: 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
f8a0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
f8b0: 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f   nCol = nEq + to
f8c0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
f8d0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
f8e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
f8f0: 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
f900: 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
f910: 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
f920: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
f930: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
f940: 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f   = topEq ? OP_Mo
f950: 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74  veLe : OP_MoveLt
f960: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f970: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f980: 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  op, iIdxCur, brk
f990: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f9b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f9c0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
f9d0: 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
f9e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f9f0: 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
fa00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fa20: 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62  Last, iIdxCur, b
fa30: 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
fa40: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
fa50: 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20  the start key.  
fa60: 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20  This is the key 
fa70: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
fa80: 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20   lower.      ** 
fa90: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61  bound on the sea
faa0: 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e  rch.  There is n
fab0: 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20 74  o start key if t
fac0: 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20  here are no.    
fad0: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65    ** equality te
fae0: 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72 65  rms and if there
faf0: 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74   is no "X>..." t
fb00: 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a  erm.  In.      *
fb10: 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e  * that case, gen
fb20: 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64 22  erate a "Rewind"
fb30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
fb40: 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20  place of the.   
fb50: 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20     ** start key 
fb60: 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a  search..      **
fb70: 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44  .      ** 2002-D
fb80: 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61  ec-04: In the ca
fb90: 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d  se of a reverse-
fba0: 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74 68  order search, th
fbb0: 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20  e so-called.    
fbc0: 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79    ** "start" key
fbd0: 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
fbe0: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68  being used as th
fbf0: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
fc00: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
fc10: 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29    if( btmLimit )
fc20: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
fc30: 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
fc40: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
fc50: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
fc60: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
fc70: 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
fc80: 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70  tReady, btmOp, p
fc90: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
fca0: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
fcb0: 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
fcc0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
fcd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
fce0: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
fcf0: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
fd00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
fd10: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fd20: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
fd30: 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72      btmEq = pTer
fd40: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 28 57  m->operator & (W
fd50: 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
fd60: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
fd70: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
fd80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd90: 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b        btmEq = 1;
fda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fdb0: 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c  f( nEq>0 || btmL
fdc0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
fdd0: 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
fde0: 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20   btmLimit;.     
fdf0: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
fe00: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c  be(v, nCol, brk,
fe10: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
fe20: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
fe30: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
fe40: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
fe50: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  m++;.          s
fe60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe70: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
fe80: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
fe90: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
fea0: 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20  Op = OP_IdxLT;. 
feb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fec0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
fed0: 20 62 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65   btmEq ? OP_Move
fee0: 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Ge : OP_MoveGt;.
fef0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ff00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
ff10: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
ff20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff30: 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
ff40: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
ff50: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
ff60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff80: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
ff90: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
ffa0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
ffb0: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
ffc0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
ffd0: 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  op.  If there is
ffe0: 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20   a termination. 
fff0: 20 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20 68       ** key we h
10000 61 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ave to test for 
10010 74 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62 6f  that key and abo
10020 72 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  rt at the top of
10030 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   the.      ** lo
10040 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
10050 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
10060 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10070 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r(v);.      if( 
10080 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
10090 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
100a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
100b0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
100c0 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
100d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
100e0 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c  AddOp(v, testOp,
100f0 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
10100 20 20 20 20 20 20 20 20 69 66 28 20 28 74 6f 70          if( (top
10110 45 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20  Eq && !bRev) || 
10120 28 21 62 74 6d 45 71 20 26 26 20 62 52 65 76 29  (!btmEq && bRev)
10130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10140 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10150 33 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33  3(v, -1, "+", P3
10160 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10170 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10190 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  Op(v, OP_RowKey,
101a0 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
101b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101c0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73  ddOp(v, OP_IdxIs
101d0 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c 20  Null, nNotNull, 
101e0 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  cont);.      if(
101f0 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
10200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10210 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
10220 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
10230 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10240 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10250 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
10260 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
10270 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
10280 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
10290 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
102a0 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20   the loop..     
102b0 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
102c0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
102d0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
102e0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
102f0 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
10300 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
10310 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
10320 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
10330 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
10340 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  N_EQ ){.      /*
10350 20 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20   Case 4:  There 
10360 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  is an index and 
10370 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
10380 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
10390 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  at.      **     
103a0 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68       refer to th
103b0 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  e index using th
103c0 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f  e "==" or "IN" o
103d0 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
103e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
103f0 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
10400 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
10410 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
10420 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
10430 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
10440 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
10450 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
10460 2a 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  * and leave the 
10470 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
10480 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
10490 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
104a0 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
104b0 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
104c0 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
104d0 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20  Ready, brk);..  
104e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
104f0 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61  a single key tha
10500 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
10510 6f 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64  o both start and
10520 20 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20 20   terminate.     
10530 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a 20   ** the search. 
10540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 75       */.      bu
10550 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c  ildIndexProbe(v,
10560 20 6e 45 71 2c 20 62 72 6b 2c 20 70 49 64 78 29   nEq, brk, pIdx)
10570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10580 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
10590 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
105a0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20  >iMem, 0);..    
105b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
105c0 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74  de (1) to move t
105d0 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  o the first matc
105e0 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
105f0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
10600 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74   ** Then generat
10610 65 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20  e code (2) that 
10620 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22 20 61  jumps to "brk" a
10630 66 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  fter the cursor 
10640 69 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  is past.      **
10650 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69   the last matchi
10660 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10670 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
10680 64 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74  de (1) is execut
10690 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  ed.      ** once
106a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
106b0 68 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63  he search, the c
106c0 6f 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75  ode (2) is execu
106d0 74 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a  ted before each.
106e0 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69        ** iterati
106f0 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74  on of the scan t
10700 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61  o see if the sca
10710 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20  n has finished. 
10720 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  */.      if( bRe
10730 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  v ){.        /* 
10740 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
10750 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
10760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10770 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20  p(v, OP_MoveLe, 
10780 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
10790 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
107a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
107b0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
107c0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
107d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
107e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
107f0 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20  IdxLT, iIdxCur, 
10800 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  brk);.        pL
10810 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
10820 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
10830 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
10840 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
10850 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
10860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10870 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
10880 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
10890 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
108a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
108b0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
108c0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
108d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
108e0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64  VdbeOp3(v, OP_Id
108f0 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20 62 72  xGE, iIdxCur, br
10900 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  k, "+", P3_STATI
10910 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  C);.        pLev
10920 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
10930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10950 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69  (v, OP_RowKey, i
10960 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
10970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10980 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75  Op(v, OP_IdxIsNu
10990 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a  ll, nEq, cont);.
109a0 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
109b0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
109c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
109d0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
109e0 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
109f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
10a10 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
10a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
10a30 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
10a40 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
10a50 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
10a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10a70 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
10a80 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
10a90 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
10aa0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
10ab0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
10ac0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
10ad0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
10ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
10af0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
10b00 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
10b10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
10b20 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
10b30 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
10b40 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
10b50 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
10b60 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
10b70 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
10b80 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
10b90 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
10ba0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
10bb0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
10bc0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
10bd0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
10be0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
10bf0 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
10c00 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
10c10 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
10c20 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
10c30 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
10c40 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
10c50 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
10c60 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
10c70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
10c80 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
10c90 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
10ca0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
10cb0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
10cc0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
10cd0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
10ce0 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
10cf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
10d00 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
10d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10d20 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
10d30 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
10d40 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
10d50 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
10d60 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
10d70 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10d80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10d90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
10da0 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20  arse, pE, cont, 
10db0 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  1);.      pTerm-
10dc0 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
10dd0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ODED;.    }..   
10de0 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
10df0 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
10e00 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
10e10 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
10e20 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ct that.    ** a
10e30 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
10e40 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
10e50 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
10e60 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
10e70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10e80 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10e90 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  n ){.      pLeve
10ea0 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  l->top = sqlite3
10eb0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10ec0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
10ed0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10ee0 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76  _MemInt, 1, pLev
10ef0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
10f00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10f10 74 28 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20  t((v, "# record 
10f20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
10f30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
10f40 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77  m=wc.a, j=0; j<w
10f50 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  c.nTerm; j++, pT
10f60 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
10f70 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
10f80 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
10f90 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
10fa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
10fb0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
10fc0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
10fd0 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
10fe0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10ff0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
11000 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11010 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
11020 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
11030 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  r, cont, 1);.   
11040 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
11050 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
11060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11070 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
11080 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
11090 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
110a0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
110b0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
110c0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
110d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
110e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
110f0 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
11100 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
11110 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
11120 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
11130 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
11140 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
11150 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
11160 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
11170 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
11180 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
11190 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
111a0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
111b0 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
111c0 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
111d0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
111e0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
111f0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
11200 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
11210 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
11220 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
11230 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
11240 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
11250 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
11260 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
11270 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
11280 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
11290 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
112a0 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
112b0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
112c0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
112d0 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
112e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
112f0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
11300 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
11310 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
11320 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11330 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b  [nQPlan], "{}");
11340 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
11350 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
11360 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  e{.        strcp
11370 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
11380 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
11390 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
113a0 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
113b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
113c0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
113d0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
113e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
113f0 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
11400 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
11410 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
11420 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
11430 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
11440 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20  QPlan], "* ");. 
11450 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
11460 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11470 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
11480 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ){.      strcpy(
11490 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
114a0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
114b0 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   ");.      nQPla
114c0 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  n += 3;.    }els
114d0 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  e{.      n = str
114e0 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78  len(pLevel->pIdx
114f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
11500 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
11510 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
11520 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
11530 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
11540 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
11550 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
11560 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
11570 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
11580 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71  += n;.        sq
11590 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
115a0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
115b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
115c0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50    }.  while( nQP
115d0 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33  lan>0 && sqlite3
115e0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
115f0 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  an-1]==' ' ){.  
11600 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
11610 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d  plan[--nQPlan] =
11620 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
11630 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
11640 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c  lan] = 0;.  nQPl
11650 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f  an = 0;.#endif /
11660 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f  * SQLITE_TEST //
11670 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   Testing and deb
11680 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
11690 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
116a0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
116b0 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
116c0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
116d0 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  ure.  Then.  ** 
116e0 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  clean up and ret
116f0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  urn..  */.  pWIn
11700 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
11710 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61  cont;.  whereCla
11720 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20  useClear(&wc);. 
11730 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
11740 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
11750 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
11760 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  */.whereBeginNoM
11770 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73  em:.  whereClaus
11780 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 73  eClear(&wc);.  s
11790 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f  qliteFree(pWInfo
117a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
117b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
117c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
117d0 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
117e0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
117f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11800 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
11810 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11820 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11830 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
11840 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56  fo *pWInfo){.  V
11850 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
11860 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
11870 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
11880 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
11890 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
118a0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
118b0 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e  bList;..  /* Gen
118c0 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
118d0 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
118e0 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69  /.  for(i=pTabLi
118f0 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30  st->nSrc-1; i>=0
11900 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
11910 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
11920 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
11930 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11940 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29  v, pLevel->cont)
11950 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
11960 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
11970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11980 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65  beAddOp(v, pLeve
11990 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
119a0 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
119b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
119c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
119d0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b  l(v, pLevel->brk
119e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
119f0 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  l->nIn ){.      
11a00 69 6e 74 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e  int *a;.      in
11a10 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
11a20 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d  =pLevel->nIn, a=
11a30 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  &pLevel->aInLoop
11a40 5b 6a 2a 33 2d 33 5d 3b 20 6a 3e 30 3b 20 6a 2d  [j*3-3]; j>0; j-
11a50 2d 2c 20 61 2d 3d 33 29 7b 0a 20 20 20 20 20 20  -, a-=3){.      
11a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11a70 4f 70 28 76 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  Op(v, a[0], a[1]
11a80 2c 20 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d  , a[2]);.      }
11a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
11aa0 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  e(pLevel->aInLoo
11ab0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
11ac0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
11ad0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
11ae0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
11af0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b00 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
11b10 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
11b20 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20  ftJoin, 0);.    
11b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b40 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
11b50 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
11b60 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  .iCursor, 0);.  
11b70 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
11b80 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20  iIdxCur>=0 ){.  
11b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11ba0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
11bb0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
11bc0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
11bd0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11be0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11bf0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
11c00 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  >top);.      sql
11c10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11c20 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
11c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
11c40 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
11c50 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
11c60 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
11c70 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
11c80 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
11c90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11ca0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
11cb0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
11cc0 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
11cd0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
11ce0 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
11cf0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
11d00 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
11d10 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
11d20 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
11d30 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
11d40 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
11d50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
11d60 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
11d70 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
11d80 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
11d90 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
11da0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
11db0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
11dc0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
11dd0 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62  ransient || pTab
11de0 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
11df0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
11e00 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
11e10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
11e20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11e30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11e40 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
11e50 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a  m->iCursor, 0);.
11e60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
11e70 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b  evel->pIdx!=0 ){
11e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11e90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
11ea0 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
11eb0 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  xCur, 0);.    }.
11ec0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72  .    /* Make cur
11ed0 73 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e  sor substitution
11ee0 73 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 72  s for cases wher
11ef0 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73 65  e we want to use
11f00 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68 65  .    ** just the
11f10 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65 72   index and never
11f20 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
11f30 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  able..    ** .  
11f40 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
11f50 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
11f60 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
11f70 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
11f80 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
11f90 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
11fa0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
11fb0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
11fc0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
11fd0 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
11fe0 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
11ff0 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
12000 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
12010 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
12020 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
12030 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
12040 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
12050 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
12060 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
12070 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
12080 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
12090 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_IDX_ONLY ){. 
120a0 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c       int i, j, l
120b0 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
120c0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
120d0 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
120e0 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20  el->pIdx;..     
120f0 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
12100 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   );.      pOp = 
12110 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
12120 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
12130 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
12140 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12150 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
12160 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69   for(i=pWInfo->i
12170 54 6f 70 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b  Top; i<last; i++
12180 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
12190 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
121a0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
121b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
121c0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
121d0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
121e0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
121f0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
12200 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
12210 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
12220 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
12230 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12240 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61  pOp->p2==pIdx->a
12250 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20  iColumn[j] ){.  
12260 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
12270 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  >p2 = j;.       
12280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
122a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
122b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
122c0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
122d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
122e0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
122f0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
12300 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
12310 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
12320 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
12330 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
12340 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
12350 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
12360 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
12370 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12380 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
12390 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
123a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49    sqliteFree(pWI
123b0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
123c0 7d 0a                                            }.