/ Hex Artifact Content
Login

Artifact 5215507b232e718606e0014f999912d53de32a70:


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 39   where.c,v 1.199
0340: 20 32 30 30 36 2f 30 31 2f 31 38 20 31 36 3a 35   2006/01/18 16:5
0350: 31 3a 33 36 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:36 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 4d 61 6c 6c 6f 63  f( sqlite3Malloc
4ac0: 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72  Failed() ) retur
4ad0: 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  n;.  prereqLeft 
4ae0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4af0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4b00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
4b10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
4b20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4b30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
4b40: 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   );.    pTerm->p
4b50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
4b60: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4b70: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
4b80: 3e 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20  >pList).        
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61    | exprSelectTa
4bb0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4bc0: 74 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  t, pExpr->pSelec
4bd0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
4be0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
4bf0: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
4c00: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4c10: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
4c20: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
4c30: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4c40: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
4c50: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4c60: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4c70: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
4c80: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
4c90: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
4ca0: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
4cb0: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  oinTable);.  }. 
4cc0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
4cd0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
4ce0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
4cf0: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
4d00: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
4d10: 20 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f    pTerm->operato
4d20: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
4d30: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
4d40: 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65  ) && (pTerm->pre
4d50: 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65  reqRight & prere
4d60: 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20  qLeft)==0 ){.   
4d70: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
4d80: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
4d90: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
4da0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
4db0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
4dc0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
4dd0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
4de0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
4df0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  iTable;.      pT
4e00: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20  erm->leftColumn 
4e10: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
4e20: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6f  ;.      pTerm->o
4e30: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
4e40: 6f 72 4d 61 73 6b 28 70 45 78 70 72 2d 3e 6f 70  orMask(pExpr->op
4e50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4e60: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
4e70: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
4e80: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
4e90: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
4ea0: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
4eb0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
4ec0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
4ed0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
4ee0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
4ef0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4f00: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
4f10: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
4f20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
4f30: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
4f40: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
4f50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
4f60: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
4f70: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
4f80: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
4f90: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
4fa0: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
4fb0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
4fc0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
4fd0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
4fe0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
4ff0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
5000: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
5010: 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PIED;.      }els
5020: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
5030: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
5040: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
5060: 72 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a  rCommute(pDup);.
5070: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44        pLeft = pD
5080: 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  up->pLeft;.     
5090: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
50a0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
50b0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  e;.      pNew->l
50c0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
50d0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
50e0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
50f0: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
5100: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
5110: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
5120: 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  All;.      pNew-
5130: 3e 6f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  >operator = oper
5140: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
5150: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
5160: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5170: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
5180: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
5190: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
51a0: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
51b0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
51c0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
51d0: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
51e0: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
51f0: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
5200: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  nts..  */.  else
5210: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
5220: 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20  TK_BETWEEN ){.  
5230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5240: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
5250: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
5260: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
5270: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
5280: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
5290: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
52a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
52b0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
52c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
52d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
52e0: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
52f0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
5300: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
5310: 20 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 73   sqlite3Expr(ops
5320: 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72  [i], sqlite3Expr
5330: 44 75 70 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  Dup(pExpr->pLeft
5340: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5370: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5380: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
5390: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
53a0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
53b0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
53c0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
53d0: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  );.      exprAna
53e0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b  lyze(pSrc, pMask
53f0: 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Set, pWC, idxNew
5400: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
5410: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
5420: 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ];.      pWC->a[
5430: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
5440: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d  = idxTerm;.    }
5450: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
5460: 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64  ld = 2;.  }.#end
5470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5480: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
5490: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
54a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
54b0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
54c0: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
54d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
54e0: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65  QUERY).  /* Atte
54f0: 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f  mpt to convert O
5500: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
5510: 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  s into an IN ope
5520: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20  rator so that.  
5530: 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65  ** they can make
5540: 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
5550: 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a    Example:.  **.
5560: 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78    **      x = ex
5570: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
5580: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
5590: 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  3.  **.  ** is c
55a0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20  onverted into.  
55b0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49  **.  **      x I
55c0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
55d0: 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  xpr3).  **.  ** 
55e0: 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
55f0: 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65  n must be omitte
5600: 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45  d if OMIT_SUBQUE
5610: 52 59 20 69 73 20 64 65 66 69 6e 65 64 20 62 65  RY is defined be
5620: 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63  cause.  ** the c
5630: 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20  ompiler for the 
5640: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
5650: 69 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71  is part of sub-q
5660: 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65  ueries..  */.  e
5670: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
5680: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
5690: 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20  int ok;.    int 
56a0: 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  i, j;.    int iC
56b0: 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a  olumn, iCursor;.
56c0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
56d0: 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65  sOr;.    WhereTe
56e0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20  rm *pOrTerm;..  
56f0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
5700: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  ->flags & TERM_D
5710: 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20  YNAMIC)==0 );.  
5720: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
5730: 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61  t(&sOr, pWC->pPa
5740: 72 73 65 29 3b 0a 20 20 20 20 77 68 65 72 65 53  rse);.    whereS
5750: 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72  plit(&sOr, pExpr
5760: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78  , TK_OR);.    ex
5770: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
5780: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26 73 4f  c, pMaskSet, &sO
5790: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
57a0: 73 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b 0a 20  sOr.nTerm>0 );. 
57b0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64 6f     j = 0;.    do
57c0: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
57d0: 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43  = sOr.a[j].leftC
57e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75  olumn;.      iCu
57f0: 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  rsor = sOr.a[j].
5800: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
5810: 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d    ok = iCursor>=
5820: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73  0;.      for(i=s
5830: 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  Or.nTerm-1, pOrT
5840: 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20  erm=sOr.a; i>=0 
5850: 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54  && ok; i--, pOrT
5860: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
5870: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6f 70 65  if( pOrTerm->ope
5880: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a  rator!=WO_EQ ){.
5890: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f            goto o
58a0: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a  r_not_possible;.
58b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
58c0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
58d0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
58e0: 6f 72 20 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c  or && pOrTerm->l
58f0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
5900: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
5910: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c  pOrTerm->flags |
5920: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
5930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5940: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
5950: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d  & TERM_COPIED)!=
5960: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
5970: 20 20 20 20 20 20 20 20 20 28 28 70 4f 72 54 65           ((pOrTe
5980: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5990: 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 26 26 0a  _VIRTUAL)!=0 &&.
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54       (sOr.a[pOrT
59c0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c  erm->iParent].fl
59d0: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b  ags & TERM_OR_OK
59e0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
59f0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
5a00: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
5a10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5a20: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
5a30: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5a40: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
5a50: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
5a60: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
5a70: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
5a80: 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20  <sOr.nTerm );.  
5a90: 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20    if( ok ){.    
5aa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5ab0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
5ac0: 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a  r *pNew, *pDup;.
5ad0: 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e        for(i=sOr.
5ae0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
5af0: 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20  =sOr.a; i>=0 && 
5b00: 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  ok; i--, pOrTerm
5b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
5b20: 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73   (pOrTerm->flags
5b30: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
5b40: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5b50: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
5b60: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 72 54  ite3ExprDup(pOrT
5b70: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
5b80: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  ht);.        pLi
5b90: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
5ba0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
5bb0: 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20  , pDup, 0);.    
5bc0: 20 20 7d 0a 20 20 20 20 20 20 70 44 75 70 20 3d    }.      pDup =
5bd0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
5be0: 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29  COLUMN, 0, 0, 0)
5bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 75 70  ;.      if( pDup
5c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70   ){.        pDup
5c10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73  ->iTable = iCurs
5c20: 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  or;.        pDup
5c30: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
5c40: 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  umn;.      }.   
5c50: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5c60: 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75  3Expr(TK_IN, pDu
5c70: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
5c80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
5c90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
5ca0: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
5cb0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
5cc0: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
5cd0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d     pNew->pList =
5ce0: 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
5cf0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
5d00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
5d10: 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55  pNew, TERM_VIRTU
5d20: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
5d30: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
5d40: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
5d50: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
5d60: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
5d70: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
5d80: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57  erm];.        pW
5d90: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61  C->a[idxNew].iPa
5da0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
5db0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
5dc0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
5dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5de0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5df0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
5e00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e      }.    }.or_n
5e10: 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20  ot_possible:.   
5e20: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5e30: 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e  r(&sOr);.  }.#en
5e40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5e50: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
5e60: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
5e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5e80: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
5e90: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
5ea0: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
5eb0: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
5ec0: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
5ed0: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
5ee0: 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f  */.  if( isLikeO
5ef0: 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61 72 73  rGlob(pWC->pPars
5f00: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26 6e  e->db, pExpr, &n
5f10: 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70  Pattern, &isComp
5f20: 6c 65 74 65 29 20 29 7b 0a 20 20 20 20 45 78 70  lete) ){.    Exp
5f30: 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  r *pLeft, *pRigh
5f40: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  t;.    Expr *pSt
5f50: 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20  r1, *pStr2;.    
5f60: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c  Expr *pNewExpr1,
5f70: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
5f80: 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64   int idxNew1, id
5f90: 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66  xNew2;..    pLef
5fa0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
5fb0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
5fc0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
5fd0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
5fe0: 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d  xpr;.    pStr1 =
5ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6000: 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29  STRING, 0, 0, 0)
6010: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31 20  ;.    if( pStr1 
6020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6030: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74 72 31  TokenCopy(&pStr1
6040: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74  ->token, &pRight
6050: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
6060: 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pStr1->token.n =
6070: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 7d   nPattern;.    }
6080: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
6090: 69 74 65 33 45 78 70 72 44 75 70 28 70 53 74 72  ite3ExprDup(pStr
60a0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  1);.    if( pStr
60b0: 32 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  2 ){.      asser
60c0: 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e  t( pStr2->token.
60d0: 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b 2b 2a  dyn );.      ++*
60e0: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b  (u8*)&pStr2->tok
60f0: 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d  en.z[nPattern-1]
6100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
6110: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
6120: 78 70 72 28 54 4b 5f 47 45 2c 20 73 71 6c 69 74  xpr(TK_GE, sqlit
6130: 65 33 45 78 70 72 44 75 70 28 70 4c 65 66 74 29  e3ExprDup(pLeft)
6140: 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20  , pStr1, 0);.   
6150: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
6160: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
6170: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
6180: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
6190: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70  YNAMIC);.    exp
61a0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
61b0: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
61c0: 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77  xNew1);.    pNew
61d0: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45  Expr2 = sqlite3E
61e0: 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c 69 74  xpr(TK_LT, sqlit
61f0: 65 33 45 78 70 72 44 75 70 28 70 4c 65 66 74 29  e3ExprDup(pLeft)
6200: 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20  , pStr2, 0);.   
6210: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
6220: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
6230: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
6240: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
6250: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70  YNAMIC);.    exp
6260: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
6270: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
6280: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
6290: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
62a0: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
62b0: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
62c0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
62d0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
62e0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
62f0: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
6300: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
6310: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
6320: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
6330: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6340: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
6350: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 0a  MIZATION */.}...
6360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6370: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
6380: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
6390: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
63a0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
63b0: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
63c0: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
63d0: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
63e0: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
63f0: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
6400: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6410: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
6420: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
6430: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
6440: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6450: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
6460: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
6470: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
6480: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
6490: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
64a0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
64b0: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
64c0: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
64d0: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
64e0: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
64f0: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
6500: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
6510: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
6520: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
6530: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
6540: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
6550: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
6560: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
6570: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
6580: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
6590: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
65a0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
65b0: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
65c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
65d0: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
65e0: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
65f0: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
6600: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
6610: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6620: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
6630: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
6640: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
6650: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
6660: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
6670: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
6680: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
6690: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
66a0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
66b0: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
66c0: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
66d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
66e0: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
66f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
6700: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
6710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6720: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6730: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6740: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
6750: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
6760: 6e 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74  ndex we are test
6770: 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ing */.  Table *
6780: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
6790: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
67a0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
67b0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
67c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
67d0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61  r number for pTa
67e0: 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  b */.  ExprList 
67f0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
6800: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
6810: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
6820: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
6830: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6840: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69  index columns wi
6850: 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  th == constraint
6860: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
6870: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
6880: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
6890: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
68a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
68d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
68e0: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6900: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
6910: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
6920: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
6930: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6950: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
6960: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
6970: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
6980: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
6990: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
69a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
69b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
69c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
69d0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
69e0: 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d  By!=0 );.  nTerm
69f0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
6a00: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  pr;.  assert( nT
6a10: 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  erm>0 );..  /* M
6a20: 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
6a30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6a40: 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
6a50: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
6a60: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  dex..  */.  for(
6a70: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72  i=j=0, pTerm=pOr
6a80: 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72  derBy->a; j<nTer
6a90: 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  m && i<pIdx->nCo
6aa0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6ab0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
6ac0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
6ad0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45  sion of the ORDE
6ae0: 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20  R BY pTerm */.  
6af0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6b00: 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  ;    /* The coll
6b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
6b20: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69  f pExpr */.    i
6b30: 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  nt termSortOrder
6b40: 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20  ; /* Sort order 
6b50: 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
6b60: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
6b70: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
6b80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6b90: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
6ba0: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
6bb0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
6bc0: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
6bd0: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
6be0: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
6bf0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
6c00: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
6c10: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
6c20: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
6c30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6c40: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
6c50: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6c60: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
6c70: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
6c80: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
6c90: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  DfltColl;.    if
6ca0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
6cb0: 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  !=pIdx->aiColumn
6cc0: 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  [i] || .        
6cd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6ce0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
6cf0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29 7b  x->azColl[i]) ){
6d00: 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a  .      /* Term j
6d10: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6d20: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
6d30: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20   match column i 
6d40: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
6d50: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43        if( i<nEqC
6d60: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
6d70: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
6d80: 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73  umn that is cons
6d90: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61  trained by == fa
6da0: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a  ils to match an.
6db0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
6dc0: 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69   BY term, that i
6dd0: 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f  s OK.  Just igno
6de0: 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f  re that column o
6df0: 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
6e00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
6e10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
6e30: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
6e40: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
6e50: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
6e60: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
6e70: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
6e80: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
6e90: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
6ea0: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
6eb0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6ec0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6ed0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6ee0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
6ef0: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
6f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
6f10: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  m->sortOrder==0 
6f20: 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  || pTerm->sortOr
6f30: 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  der==1 );.    as
6f40: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
6f50: 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c 7c 20  tOrder[i]==0 || 
6f60: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6f70: 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  [i]==1 );.    te
6f80: 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49  rmSortOrder = pI
6f90: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
6fa0: 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  ] ^ pTerm->sortO
6fb0: 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e  rder;.    if( i>
6fc0: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
6fd0: 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
6fe0: 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  r!=sortOrder ){.
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
7000: 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  es can only be u
7010: 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52  sed if all ORDER
7020: 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74   BY terms past t
7030: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71  he.        ** eq
7040: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
7050: 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ts are all eithe
7060: 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a  r DESC or ASC. *
7070: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
7080: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72  }else{.      sor
70a0: 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
70b0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
70c0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
70d0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ++;.  }..  /* Th
70e0: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
70f0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  sed for sorting 
7100: 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  if all terms of 
7110: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7120: 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f 76  use.  ** are cov
7130: 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ered..  */.  if(
7140: 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20   j>=nTerm ){.   
7150: 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72   *pbRev = sortOr
7160: 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65 74 75  der!=0;.    retu
7170: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
7180: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
7190: 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65  heck table to se
71a0: 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  e if the ORDER B
71b0: 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64  Y clause in pOrd
71c0: 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69  erBy can be sati
71d0: 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74  sfied.** by sort
71e0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ing in order of 
71f0: 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74  ROWID.  Return t
7200: 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65  rue if so and se
7210: 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a  t *pbRev to be.*
7220: 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72  * true for rever
7230: 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c  se ROWID and fal
7240: 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52  se for forward R
7250: 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  OWID order..*/.s
7260: 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62  tatic int sortab
7270: 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74  leByRowid(.  int
7280: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
7290: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
72a0: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
72b0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
72c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
72d0: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
72e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
72f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
7320: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
7330: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a  .){.  Expr *p;..
7340: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
7350: 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
7360: 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
7370: 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f  pr>0 );.  p = pO
7380: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
7390: 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  pr;.  if( pOrder
73a0: 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  By->nExpr==1 && 
73b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
73c0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62   && p->iTable==b
73d0: 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 26 26  ase.          &&
73e0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20   p->iColumn==-1 
73f0: 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20  ){.    *pbRev = 
7400: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
7410: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65  ortOrder;.    re
7420: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
7430: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7440: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
7450: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
7460: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
7470: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
7480: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
7490: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
74a0: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
74b0: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
74c0: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
74d0: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
74e0: 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69  ng operatings wi
74f0: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
7500: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
7510: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
7520: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
7530: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
7540: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
7550: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
7560: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
7570: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
7580: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
7590: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
75a0: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
75b0: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
75c0: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
75d0: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
75e0: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
75f0: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73  .** Find the bes
7600: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65  t index for acce
7610: 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
7620: 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  ar table.  Retur
7630: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
7640: 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61  o the index, fla
7650: 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
7660: 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73   how the index s
7670: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74  hould be used, t
7680: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
7690: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
76a0: 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63  ints, and the "c
76b0: 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e  ost" for this in
76c0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  dex..**.** The l
76d0: 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78  owest cost index
76e0: 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
76f0: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
7700: 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
7710: 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
7720: 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f   I/O need to pro
7730: 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
7740: 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63   using the selec
7750: 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61  ted index..** Fa
7760: 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
7770: 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
7780: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
7790: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
77a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
77b0: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
77c0: 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
77d0: 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
77e0: 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
77f0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
7800: 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
7810: 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
7820: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
7830: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
7840: 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
7850: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
7860: 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
7870: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
7880: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
7890: 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
78a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
78c0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
78d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
78e0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
78f0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
7900: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
7910: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7920: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
7930: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
7940: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
7950: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
7970: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
7980: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
7990: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
79a0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
79b0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
79c0: 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
79d0: 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c  Index **ppIndex,
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
79f0: 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69  ake *ppIndex poi
7a00: 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69  nt to the best i
7a10: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
7a20: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
7a30: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61        /* Put fla
7a40: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
7a50: 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46  is choice in *pF
7a60: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
7a70: 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20  nEq             
7a80: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65        /* Put the
7a90: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
7aa0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
7ab0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  here */.){.  Whe
7ac0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7ad0: 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20   Index *bestIdx 
7ae0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7af0: 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73  Index that gives
7b00: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
7b10: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77   */.  double low
7b20: 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  estCost;        
7b30: 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
7b40: 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a   using bestIdx *
7b50: 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67  /.  int bestFlag
7b60: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
7b70: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
7b80: 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78  ted with bestIdx
7b90: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45   */.  int bestNE
7ba0: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
7bb0: 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20    /* Best value 
7bc0: 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74  for nEq */.  int
7bd0: 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
7be0: 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
7bf0: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
7c00: 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
7c10: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
7c20: 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
7c30: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
7c40: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
7c50: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20  g */.  int rev; 
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
7c80: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
7c90: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  der */.  int fla
7ca0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
7cb0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
7cc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
7cd0: 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  robe */.  int nE
7ce0: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
7cf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d00: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
7d10: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75  traints */.  dou
7d20: 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
7d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
7d40: 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
7d50: 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62   */..  TRACE(("b
7d60: 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
7d70: 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c   notReady=%x\n",
7d80: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
7d90: 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a  me, notReady));.
7da0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53    lowestCost = S
7db0: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a  QLITE_BIG_DBL;..
7dc0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
7dd0: 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72   rowid=EXPR or r
7de0: 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f  owid IN (...) co
7df0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
7e00: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
7e10: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
7e20: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
7e30: 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66  |WO_IN, 0);.  if
7e40: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45  ( pTerm ){.    E
7e50: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
7e60: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
7e70: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48    bestFlags = WH
7e80: 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20  ERE_ROWID_EQ;.  
7e90: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65    if( pTerm->ope
7ea0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b  rator & WO_EQ ){
7eb0: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d  .      /* Rowid=
7ec0: 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  = is always the 
7ed0: 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b  best pick.  Look
7ee0: 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65   no further.  Be
7ef0: 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20  cause only.     
7f00: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   ** a single row
7f10: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f   is generated, o
7f20: 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20  utput is always 
7f30: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
7f40: 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73  */.      *pFlags
7f50: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
7f60: 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45  Q | WHERE_UNIQUE
7f70: 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20  ;.      *pnEq = 
7f80: 31 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  1;.      TRACE((
7f90: 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77  "... best is row
7fa0: 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  id\n"));.      r
7fb0: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
7fc0: 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20  else if( (pExpr 
7fd0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d  = pTerm->pExpr)-
7fe0: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
7ff0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
8000: 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LIST): cost is N
8010: 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
8020: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
8030: 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  st.      ** elem
8040: 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
8050: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78  lowestCost = pEx
8060: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8070: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
8080: 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77  st *= estLog(low
8090: 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65  estCost);.    }e
80a0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  lse{.      /* Ro
80b0: 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a  wid IN (SELECT):
80c0: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
80d0: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
80e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
80f0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
8100: 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
8110: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
8120: 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
8130: 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  mate.      ** th
8140: 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65  at value so make
8150: 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a   a wild guess. *
8160: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
8170: 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a  st = 200;.    }.
8180: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
8190: 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25  rowid IN cost: %
81a0: 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f  .9g\n", lowestCo
81b0: 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
81c0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73  Estimate the cos
81d0: 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61  t of a table sca
81e0: 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  n.  If we do not
81f0: 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20   know how many. 
8200: 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20   ** entries are 
8210: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73  in the table, us
8220: 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61  e 1 million as a
8230: 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70   guess..  */.  p
8240: 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54  Probe = pSrc->pT
8250: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f  ab->pIndex;.  co
8260: 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50  st = pProbe ? pP
8270: 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30  robe->aiRowEst[0
8280: 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 54  ] : 1000000;.  T
8290: 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
82a0: 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
82b0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
82c0: 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52  ;.  flags = WHER
82d0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a  E_ROWID_RANGE;..
82e0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
82f0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20  onstraints on a 
8300: 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20  range of rowids 
8310: 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  in a table scan.
8320: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
8330: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
8340: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
8350: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
8360: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
8370: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
8380: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
8390: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
83a0: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
83b0: 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
83c0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
83d0: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
83e0: 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20   cost /= 3;  /* 
83f0: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
8400: 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  <EXPR eliminates
8410: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72   two-thirds or r
8420: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
8430: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
8440: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
8450: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
8460: 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  GE, 0) ){.      
8470: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
8480: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
8490: 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
84a0: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e  uess that rowid>
84b0: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
84c0: 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
84d0: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
84e0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69  TRACE(("... rowi
84f0: 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  d range reduces 
8500: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
8510: 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65   cost));.  }else
8520: 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b  {.    flags = 0;
8530: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8540: 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65  e table scan doe
8550: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  s not satisfy th
8560: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8570: 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a  e, increase.  **
8580: 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f   the cost by Nlo
8590: 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  gN to cover the 
85a0: 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69  expense of sorti
85b0: 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ng. */.  if( pOr
85c0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
85d0: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
85e0: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
85f0: 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
8600: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
8610: 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57  RDERBY|WHERE_ROW
8620: 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  ID_RANGE;.      
8630: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
8640: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8650: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
8660: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8670: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
8680: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
8690: 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e       TRACE(("...
86a0: 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
86b0: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
86c0: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
86d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74  }.  }.  if( cost
86e0: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
86f0: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
8700: 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c  cost;.    bestFl
8710: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
8720: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65  ..  /* Look at e
8730: 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  ach index..  */.
8740: 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
8750: 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
8760: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
8770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8780: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8790: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64  counter */.    d
87a0: 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69  ouble inMultipli
87b0: 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54 52 41  er = 1;..    TRA
87c0: 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25  CE(("... index %
87d0: 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a  s:\n", pProbe->z
87e0: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
87f0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
8800: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
8810: 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
8820: 65 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20  e satisfied.    
8830: 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e  ** by x=EXPR con
8840: 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e  straints or x IN
8850: 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
8860: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ts..    */.    f
8870: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  lags = 0;.    fo
8880: 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d  r(i=0; i<pProbe-
8890: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
88a0: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
88b0: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  robe->aiColumn[i
88c0: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
88d0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
88e0: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
88f0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70  , WO_EQ|WO_IN, p
8900: 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
8910: 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
8920: 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  ak;.      flags 
8930: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
8940: 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  EQ;.      if( pT
8950: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20  erm->operator & 
8960: 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
8970: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
8980: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8990: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
89a0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
89b0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
89c0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a  ->pSelect!=0 ){.
89d0: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
89e0: 69 70 6c 69 65 72 20 2a 3d 20 31 30 30 3b 0a 20  iplier *= 100;. 
89f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8a00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30   pExpr->pList!=0
8a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
8a20: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45  Multiplier *= pE
8a30: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
8a40: 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
8a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a60: 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65     cost = pProbe
8a70: 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20  ->aiRowEst[i] * 
8a80: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65  inMultiplier * e
8a90: 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69  stLog(inMultipli
8aa0: 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69  er);.    nEq = i
8ab0: 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
8ac0: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
8ad0: 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  ne && (flags & W
8ae0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
8af0: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  =0.         && n
8b00: 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
8b10: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  umn ){.      fla
8b20: 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51  gs |= WHERE_UNIQ
8b30: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  UE;.    }.    TR
8b40: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71  ACE(("...... nEq
8b50: 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20  =%d inMult=%.9g 
8b60: 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45  cost=%.9g\n", nE
8b70: 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c  q, inMultiplier,
8b80: 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a   cost));..    /*
8b90: 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20   Look for range 
8ba0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
8bb0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70  */.    if( nEq<p
8bc0: 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
8bd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
8be0: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
8bf0: 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  [nEq];.      pTe
8c00: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
8c10: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
8c20: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
8c30: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  E|WO_GT|WO_GE, p
8c40: 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
8c50: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
8c60: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8c70: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
8c80: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
8c90: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
8ca0: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
8cb0: 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65  LT|WO_LE, pProbe
8cc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
8cd0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
8ce0: 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
8cf0: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
8d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8d10: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
8d20: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
8d30: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
8d40: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
8d50: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
8d60: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
8d70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
8d80: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
8d90: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
8da0: 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64  ...... range red
8db0: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
8dc0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
8dd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8de0: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69   /* Add the addi
8df0: 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73  tional cost of s
8e00: 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69  orting if that i
8e10: 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20  s a factor..    
8e20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  */.    if( pOrde
8e30: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rBy ){.      if(
8e40: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
8e50: 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26  COLUMN_IN)==0 &&
8e60: 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f  .           isSo
8e70: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
8e80: 65 2c 70 50 72 6f 62 65 2c 70 53 72 63 2d 3e 70  e,pProbe,pSrc->p
8e90: 54 61 62 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  Tab,iCur,pOrderB
8ea0: 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20  y,nEq,&rev) ){. 
8eb0: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73         if( flags
8ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ed0: 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43   flags = WHERE_C
8ee0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
8ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
8f00: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
8f10: 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69  DERBY;.        i
8f20: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
8f30: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8f40: 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
8f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
8f60: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  e{.        cost 
8f70: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
8f80: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ost);.        TR
8f90: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64  ACE(("...... ord
8fa0: 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63  erby increases c
8fb0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
8fc0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
8fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
8fe0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
8ff0: 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69   can get away wi
9000: 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  th using just th
9010: 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a  e index without.
9020: 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64      ** ever read
9030: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
9040: 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
9050: 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20  ase, then halve 
9060: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
9070: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
9080: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c     */.    if( fl
9090: 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c  ags && pSrc->col
90a0: 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73  Used < (((Bitmas
90b0: 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
90c0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
90d0: 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
90e0: 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  d;.      int j;.
90f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9100: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
9110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9120: 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e  int x = pProbe->
9130: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
9140: 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20   ){.          m 
9160: 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31  &= ~(((Bitmask)1
9170: 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  )<<x);.        }
9180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9190: 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
91a0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
91b0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
91c0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20      cost /= 2;. 
91d0: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
91e0: 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72  ..... idx-only r
91f0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
9200: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9220: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
9230: 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64  dex has achieved
9240: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
9250: 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73   so far, then us
9260: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
9270: 20 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65   if( cost < lowe
9280: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  stCost ){.      
9290: 62 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65  bestIdx = pProbe
92a0: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
92b0: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20  st = cost;.     
92c0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d   assert( flags!=
92d0: 30 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46  0 );.      bestF
92e0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
92f0: 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45      bestNEq = nE
9300: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  q;.    }.  }..  
9310: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65  /* Report the be
9320: 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20  st result.  */. 
9330: 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74   *ppIndex = best
9340: 49 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62  Idx;.  TRACE(("b
9350: 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c  est index is %s,
9360: 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67   cost=%.9g, flag
9370: 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c  s=%x, nEq=%d\n",
9380: 0a 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78  .        bestIdx
9390: 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d   ? bestIdx->zNam
93a0: 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f  e : "(none)", lo
93b0: 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c  westCost, bestFl
93c0: 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a  ags, bestNEq));.
93d0: 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74    *pFlags = best
93e0: 46 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d  Flags;.  *pnEq =
93f0: 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75   bestNEq;.  retu
9400: 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d  rn lowestCost;.}
9410: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  .../*.** Disable
9420: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
9430: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
9440: 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
9450: 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
9460: 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
9470: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
9480: 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
9490: 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
94a0: 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
94b0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
94c0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
94d0: 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
94e0: 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
94f0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
9500: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
9510: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
9520: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
9530: 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
9540: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
9550: 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
9560: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
9570: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
9580: 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
9590: 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
95a0: 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
95b0: 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
95c0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
95d0: 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
95e0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
95f0: 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
9600: 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
9610: 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
9620: 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
9630: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
9640: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
9650: 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
9660: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
9670: 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
9680: 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
9690: 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
96a0: 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
96b0: 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
96c0: 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
96d0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
96e0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
96f0: 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
9700: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
9710: 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
9720: 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
9730: 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
9740: 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
9750: 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
9760: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
9770: 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
9780: 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
9790: 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
97a0: 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
97b0: 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
97c0: 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
97d0: 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
97e0: 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
97f0: 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
9800: 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
9810: 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
9820: 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
9830: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
9840: 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
9850: 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
9860: 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
9870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9880: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
9890: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
98a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
98b0: 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
98c0: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
98d0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
98e0: 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
98f0: 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
9900: 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
9910: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
9920: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
9930: 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
9940: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
9950: 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
9960: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
9970: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
9980: 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
9990: 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
99a0: 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
99b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
99c0: 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
99d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
99e0: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
99f0: 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
9a00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9a10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9a20: 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61  de that builds a
9a30: 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e   probe for an in
9a40: 64 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a  dex.  Details:.*
9a50: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b  *.**    *  Check
9a60: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
9a70: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20   entries on the 
9a80: 73 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a  stack.  If any.*
9a90: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  *       of those
9aa0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c   entries are NUL
9ab0: 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  L, jump immediat
9ac0: 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20  ely to brk,.**  
9ad0: 20 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68       which is th
9ae0: 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e  e loop exit, sin
9af0: 63 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72  ce no index entr
9b00: 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20  y will match.** 
9b10: 20 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72        if any par
9b20: 74 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  t of the key is 
9b30: 4e 55 4c 4c 2e 20 50 6f 70 20 28 6e 43 6f 6c 75  NULL. Pop (nColu
9b40: 6d 6e 2b 6e 45 78 74 72 61 29 20 0a 2a 2a 20 20  mn+nExtra) .**  
9b50: 20 20 20 20 20 65 6c 65 6d 65 6e 74 73 20 66 72       elements fr
9b60: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  om the stack..**
9b70: 0a 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72  .**    *  Constr
9b80: 75 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72  uct a probe entr
9b90: 79 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e  y from the top n
9ba0: 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69  Column entries i
9bb0: 6e 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73  n.**       the s
9bc0: 74 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69  tack with affini
9bd0: 74 69 65 73 20 61 70 70 72 6f 70 72 69 61 74 65  ties appropriate
9be0: 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e   for index pIdx.
9bf0: 20 0a 2a 2a 20 20 20 20 20 20 20 4f 6e 6c 79 20   .**       Only 
9c00: 6e 43 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74 73  nColumn elements
9c10: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
9c20: 20 74 68 65 20 73 74 61 63 6b 20 69 6e 20 74 68   the stack in th
9c30: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20  is case.**      
9c40: 20 28 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   (by OP_MakeReco
9c50: 72 64 29 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  rd)..**.*/.stati
9c60: 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65  c void buildInde
9c70: 78 50 72 6f 62 65 28 0a 20 20 56 64 62 65 20 2a  xProbe(.  Vdbe *
9c80: 76 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  v, .  int nColum
9c90: 6e 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  n, .  int nExtra
9ca0: 2c 20 0a 20 20 69 6e 74 20 62 72 6b 2c 20 0a 20  , .  int brk, . 
9cb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 0a 29 7b 0a   Index *pIdx.){.
9cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9cd0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
9ce0: 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69  , -nColumn, sqli
9cf0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9d00: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
9d10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9d20: 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b  OP_Pop, nColumn+
9d30: 6e 45 78 74 72 61 2c 20 30 29 3b 0a 20 20 73 71  nExtra, 0);.  sq
9d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9d50: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72  , OP_Goto, 0, br
9d60: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  k);.  sqlite3Vdb
9d70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
9d80: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
9d90: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  , 0);.  sqlite3I
9da0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
9db0: 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a  v, pIdx);.}.../*
9dc0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9dd0: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
9de0: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
9df0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9e00: 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
9e10: 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
9e20: 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
9e30: 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
9e40: 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
9e50: 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
9e60: 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
9e70: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
9e80: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
9e90: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
9ea0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
9eb0: 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
9ec0: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
9ed0: 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
9ee0: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
9ef0: 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
9f00: 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
9f10: 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
9f20: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
9f30: 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
9f40: 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
9f50: 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
9f60: 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
9f70: 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
9f80: 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
9f90: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75  tic void codeEqu
9fa0: 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
9fb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9fc0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
9fd0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
9fe0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
9ff0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
a000: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a010: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
a020: 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20    int brk,      
a030: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
a040: 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68  re to abandon th
a050: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  e loop */.  Wher
a060: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
a070: 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
a080: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a090: 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
a0a0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
a0b0: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
a0c0: 70 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70  pr;.  if( pX->op
a0d0: 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  !=TK_IN ){.    a
a0e0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
a0f0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69  K_EQ );.    sqli
a100: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a110: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
a120: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a130: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
a140: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
a150: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49  Tab;.    int *aI
a160: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  n;.    Vdbe *v =
a170: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
a190: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
a1a0: 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20  , pX);.    iTab 
a1b0: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
a1c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1d0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
a1e0: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20   iTab, brk);.   
a1f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a200: 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73   "# %.*s", pX->s
a210: 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
a220: 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  z));.    pLevel-
a230: 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  >nIn++;.    sqli
a240: 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  teReallocOrFree(
a250: 28 76 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d  (void**)&pLevel-
a260: 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  >aInLoop,.      
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
a290: 66 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  f(pLevel->aInLoo
a2a0: 70 5b 30 5d 29 2a 33 2a 70 4c 65 76 65 6c 2d 3e  p[0])*3*pLevel->
a2b0: 6e 49 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20  nIn);.    aIn = 
a2c0: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b  pLevel->aInLoop;
a2d0: 0a 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a  .    if( aIn ){.
a2e0: 20 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65        aIn += pLe
a2f0: 76 65 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a  vel->nIn*3 - 3;.
a300: 20 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 4f        aIn[0] = O
a310: 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 49  P_Next;.      aI
a320: 6e 5b 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20  n[1] = iTab;.   
a330: 20 20 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c 69     aIn[2] = sqli
a340: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a350: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
a360: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
a370: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49        pLevel->nI
a380: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
a390: 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
a3a0: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
a3b0: 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  erm);.}../*.** G
a3c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
a3d0: 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
a3e0: 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
a3f0: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
a400: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20  .** index.  The 
a410: 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63  values for all c
a420: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c  onstraints are l
a430: 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
a440: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
a450: 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
a460: 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
a470: 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
a480: 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
a490: 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
a4a0: 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
a4b0: 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
a4c0: 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
a4d0: 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
a4e0: 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
a4f0: 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
a500: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
a510: 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
a520: 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
a530: 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
a540: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
a550: 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
a560: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
a570: 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
a580: 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
a590: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
a5a0: 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
a5b0: 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
a5c0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
a5d0: 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
a5e0: 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74   be left.** on t
a5f0: 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20  he stack - a is 
a600: 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64 20  the deepest and 
a610: 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74  b the shallowest
a620: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
a630: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
a640: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
a650: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
a660: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
a670: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
a680: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
a690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a6a0: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
a6b0: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
a6c0: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
a6d0: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
a6e0: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
a6f0: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
a700: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
a710: 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
a720: 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
a730: 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68  l and puts.** th
a740: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 61  e address of tha
a750: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
a760: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20   pLevel->iMem.  
a770: 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
a780: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
a790: 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65  ine will use pLe
a7a0: 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f  vel->iMem to sto
a7b0: 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
a7c0: 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
a7d0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
a7e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
a7f0: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
a800: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
a810: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
a820: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
a830: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
a840: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
a850: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
a860: 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  oid codeAllEqual
a870: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
a880: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a890: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a8a0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
a8b0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
a8c0: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
a8d0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
a8e0: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
a8f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a900: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
a910: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
a920: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a930: 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
a940: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
a950: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
a960: 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
a970: 20 62 72 6b 20 20 20 20 20 20 20 20 20 20 20 20   brk            
a980: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a990: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
a9a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20  */.){.  int nEq 
a9b0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20  = pLevel->nEq;  
a9c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
a9d0: 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
a9e0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
a9f0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72  ode */.  int ter
aa00: 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20  msInMem = 0;    
aa10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
aa20: 65 2c 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69  e, store value i
aa30: 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f  n mem[] cells */
aa40: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
aa50: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
aa60: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
aa70: 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
aa80: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
aa90: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
aaa0: 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a  evel->pIdx;   /*
aab0: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
aac0: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
aad0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
aae0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
aaf0: 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
ab00: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
ab10: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
ab20: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
ab30: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
ab40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
ab50: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ab80: 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ter */..  /* Fig
ab90: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
aba0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
abb0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
abc0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
abd0: 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65   ** We always ne
abe0: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ed at least one 
abf0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
ac00: 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  e loop terminato
ac10: 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49  r.  ** value.  I
ac20: 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f  f there are IN o
ac30: 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e  perators we'll n
ac40: 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  eed one for each
ac50: 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63   == or.  ** IN c
ac60: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
ac70: 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
ac80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
ac90: 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  .  if( pLevel->f
aca0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
acb0: 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50  UMN_IN ){.    pP
acc0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
acd0: 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74  evel->nEq;.    t
ace0: 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20  ermsInMem = 1;. 
acf0: 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
ad00: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
ad10: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
ad20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
ad30: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
ad40: 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  {.    int k = pI
ad50: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
ad60: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
ad70: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
ad80: 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   k, notReady, WO
ad90: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29  _EQ|WO_IN, pIdx)
ada0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d  ;.    if( pTerm=
adb0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
adc0: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
add0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
ade0: 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f  ED)==0 );.    co
adf0: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
ae00: 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72  Parse, pTerm, br
ae10: 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  k, pLevel);.    
ae20: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
ae30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ae40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ae50: 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
ae60: 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20  >iMem+j+1, 1);. 
ae70: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ae80: 74 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20  t( j==nEq );..  
ae90: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
aea0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
aeb0: 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68  values are on th
aec0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
aed0: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65  ck.  */.  if( te
aee0: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
aef0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
af00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
af10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
af20: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
af30: 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29  el->iMem+j+1, 0)
af40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
af50: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
af60: 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
af70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
af80: 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
af90: 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
afa0: 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
afb0: 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
afc0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
afd0: 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
afe0: 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
aff0: 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
b000: 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
b010: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
b020: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
b030: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
b040: 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
b050: 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
b060: 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
b070: 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
b080: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
b090: 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
b0a0: 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0c0: 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
b0d0: 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
b0e0: 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
b0f0: 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f  ITE_TEST */..../
b100: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
b110: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
b120: 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
b130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
b140: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
b150: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
b160: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
b170: 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
b180: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
b190: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
b1a0: 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
b1b0: 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
b1c0: 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
b1d0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
b1e0: 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
b1f0: 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
b200: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
b210: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
b220: 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
b230: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
b240: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
b250: 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
b260: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b270: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
b280: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
b290: 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
b2a0: 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
b2b0: 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
b2c0: 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
b2d0: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
b2e0: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
b2f0: 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
b300: 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
b310: 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
b320: 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
b330: 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
b340: 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
b350: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
b360: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
b370: 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
b380: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
b390: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
b3a0: 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
b3b0: 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
b3c0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
b3d0: 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
b3e0: 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
b3f0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
b400: 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
b410: 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
b420: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
b430: 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
b440: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
b450: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
b460: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
b470: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
b480: 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
b490: 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
b4a0: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
b4b0: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
b4d0: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
b4e0: 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
b510: 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
b520: 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
b550: 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
b560: 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
b570: 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
b580: 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
b590: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
b5a0: 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
b5b0: 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
b5c0: 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
b5d0: 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
b5e0: 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
b5f0: 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
b600: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
b610: 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
b620: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
b630: 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
b640: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
b650: 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
b660: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
b670: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
b680: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
b690: 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
b6a0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
b6b0: 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
b6c0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
b6d0: 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
b6e0: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
b6f0: 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
b700: 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
b710: 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
b720: 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
b730: 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
b740: 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
b750: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
b760: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
b770: 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
b780: 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
b790: 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
b7a0: 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
b7b0: 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
b7c0: 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
b7d0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
b7e0: 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
b7f0: 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
b800: 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
b810: 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
b820: 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
b830: 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
b840: 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
b850: 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
b860: 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
b870: 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
b880: 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
b890: 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
b8a0: 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
b8b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
b8c0: 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
b8d0: 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
b8e0: 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
b8f0: 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
b900: 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
b910: 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
b920: 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
b930: 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
b940: 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
b950: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
b960: 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
b970: 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
b980: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
b990: 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
b9a0: 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
b9b0: 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
b9c0: 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
b9d0: 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
b9e0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
b9f0: 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
ba00: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
ba10: 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
ba20: 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
ba30: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
ba40: 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
ba50: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
ba60: 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
ba70: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
ba80: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
ba90: 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
baa0: 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
bab0: 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
bac0: 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
bad0: 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
bae0: 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
baf0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
bb00: 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
bb10: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
bb20: 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
bb30: 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
bb40: 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
bb50: 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
bb60: 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
bb70: 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
bb80: 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
bb90: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
bba0: 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
bbb0: 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
bbc0: 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
bbd0: 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
bbe0: 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
bbf0: 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
bc00: 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
bc10: 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
bc20: 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
bc30: 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
bc40: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bc50: 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
bc60: 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
bc70: 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
bc80: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
bc90: 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
bca0: 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
bcb0: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
bcc0: 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
bcd0: 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
bce0: 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
bcf0: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
bd00: 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
bd10: 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
bd20: 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
bd30: 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
bd40: 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
bd50: 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
bd60: 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
bd70: 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
bd80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
bd90: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
bda0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
bdb0: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
bdc0: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
bdd0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
bde0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
bdf0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
be00: 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
be10: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
be20: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
be30: 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
be40: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
be50: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
be60: 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
be70: 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
be80: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
be90: 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
bea0: 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
beb0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
bec0: 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
bed0: 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
bee0: 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
bef0: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
bf00: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
bf10: 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
bf20: 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
bf30: 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
bf40: 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
bf50: 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
bf60: 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
bf70: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
bf80: 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
bf90: 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
bfa0: 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
bfb0: 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
bfc0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
bfd0: 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
bfe0: 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
bff0: 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
c000: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
c010: 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
c020: 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
c030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c040: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
c050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
c060: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
c070: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
c080: 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
c090: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
c0a0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
c0b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
c0c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
c0d0: 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
c0e0: 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By  /* An ORDER 
c0f0: 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
c100: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  LL */.){.  int i
c110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c120: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c130: 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  unter */.  Where
c140: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
c150: 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
c160: 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
c170: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
c180: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
c190: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c1a0: 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
c1b0: 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
c1c0: 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62  ngine */.  int b
c1d0: 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20  rk, cont = 0;   
c1e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
c1f0: 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63  es used during c
c200: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ode generation *
c210: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
c220: 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
c230: 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
c240: 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
c250: 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
c260: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
c270: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
c280: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  e term in the WH
c290: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
c2a0: 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b  ExprMaskSet mask
c2b0: 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Set;       /* Th
c2c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
c2d0: 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
c2e0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
c2f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c300: 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76  RE clause is div
c310: 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20  ided into these 
c320: 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
c330: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
c340: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
c350: 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
c360: 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
c370: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
c380: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
c390: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
c3a0: 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
c3b0: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
c3c0: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
c3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c3e0: 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
c3f0: 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
c400: 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c420: 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
c430: 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b  ion of all wc.a[
c440: 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a  ].flags */..  /*
c450: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
c460: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
c470: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
c480: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
c490: 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
c4a0: 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
c4b0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c4c0: 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
c4d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c4e0: 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
c4f0: 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
c500: 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
c510: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c520: 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
c530: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
c540: 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
c550: 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
c560: 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
c570: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
c580: 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
c590: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
c5a0: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61   initMaskSet(&ma
c5b0: 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
c5c0: 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70  lauseInit(&wc, p
c5d0: 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53  Parse);.  whereS
c5e0: 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65  plit(&wc, pWhere
c5f0: 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
c600: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
c610: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
c620: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
c630: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
c640: 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
c650: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a  eturn value..  *
c660: 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
c670: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
c680: 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
c690: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
c6a0: 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
c6b0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c6c0: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
c6d0: 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
c6e0: 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a  BeginNoMem;.  }.
c6f0: 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
c700: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
c710: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
c720: 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
c730: 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
c740: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c750: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  l(v);..  /* Spec
c760: 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
c770: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
c780: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
c790: 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
c7a0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
c7b0: 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
c7c0: 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
c7d0: 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
c7e0: 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
c7f0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
c800: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
c810: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 68  prIsConstant(pWh
c820: 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
c830: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
c840: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
c850: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
c860: 31 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  1);.    pWhere =
c870: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   0;.  }..  /* An
c880: 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
c890: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
c8a0: 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
c8b0: 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
c8c0: 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
c8d0: 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
c8e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
c8f0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
c900: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
c910: 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
c920: 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
c930: 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
c940: 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
c950: 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
c960: 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
c970: 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
c980: 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
c990: 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
c9a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
c9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
c9c0: 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
c9d0: 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
c9e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
c9f0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41  or);.  }.  exprA
ca00: 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
ca10: 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20 26 77  st, &maskSet, &w
ca20: 63 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  c);.  if( sqlite
ca30: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
ca40: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
ca50: 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d  eBeginNoMem;.  }
ca60: 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65  ..  /* Chose the
ca70: 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75   best index to u
ca80: 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  se for each tabl
ca90: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
caa0: 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
cab0: 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20  This loop fills 
cac0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
cad0: 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20   fields:.  **.  
cae0: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
caf0: 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69  .pIdx      The i
cb00: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
cb10: 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68  this level of th
cb20: 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70  e loop..  **   p
cb30: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73  WInfo->a[].flags
cb40: 20 20 20 20 20 57 48 45 52 45 5f 78 78 78 20 66       WHERE_xxx f
cb50: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
cb60: 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20  with pIdx.  **  
cb70: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71   pWInfo->a[].nEq
cb80: 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65         The numbe
cb90: 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63  r of == and IN c
cba0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
cbb0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46    pWInfo->a[].iF
cbc0: 72 6f 6d 20 20 20 20 20 57 68 65 6e 20 74 65 72  rom     When ter
cbd0: 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
cbe0: 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
cbf0: 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
cc00: 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
cc10: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
cc20: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
cc30: 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
cc40: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
cc50: 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
cc60: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
cc70: 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  ex.  **.  ** Thi
cc80: 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
cc90: 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
cca0: 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
ccb0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
ccc0: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
ccd0: 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
cce0: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54  (Bitmask)0;.  pT
ccf0: 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  abItem = pTabLis
cd00: 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  t->a;.  pLevel =
cd10: 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e   pWInfo->a;.  an
cd20: 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 54  dFlags = ~0;.  T
cd30: 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
cd40: 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
cd50: 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72  "));.  for(i=iFr
cd60: 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  om=0, pLevel=pWI
cd70: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
cd80: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
cd90: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e  Level++){.    In
cda0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
cdb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
cdc0: 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c  ex for FROM tabl
cdd0: 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f  e at pTabItem */
cde0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  .    int flags; 
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63   /* Flags asssoc
ce10: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
ce20: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  */.    int nEq; 
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ce50: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
ce60: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62  ints */.    doub
ce70: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
ce80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
ce90: 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ost for pIdx */.
cea0: 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ced0: 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20  ver FROM tables 
cee0: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42  */.    Index *pB
cef0: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
cf00: 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69     /* The best i
cf10: 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72  ndex seen so far
cf20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
cf30: 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
cf40: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
cf50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65  ociated with pBe
cf60: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  st */.    int be
cf70: 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20  stNEq = 0;      
cf80: 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73        /* nEq ass
cf90: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65  ociated with pBe
cfa0: 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  st */.    double
cfb0: 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20   lowestCost;    
cfc0: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
cfd0: 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20   the pBest */.  
cfe0: 20 20 69 6e 74 20 62 65 73 74 4a 3b 20 20 20 20    int bestJ;    
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d000: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20   The value of j 
d010: 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
d020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d030: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61     /* Bitmask va
d040: 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73  lue for j or bes
d050: 74 4a 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73  tJ */..    lowes
d060: 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  tCost = SQLITE_B
d070: 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28  IG_DBL;.    for(
d080: 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65  j=iFrom, pTabIte
d090: 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  m=&pTabList->a[j
d0a0: 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ]; j<pTabList->n
d0b0: 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74  Src; j++, pTabIt
d0c0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 20 3d  em++){.      m =
d0d0: 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
d0e0: 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
d0f0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
d100: 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d   (m & notReady)=
d110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
d120: 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
d130: 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  om++;.        co
d140: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
d150: 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
d160: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
d170: 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  wc, pTabItem, no
d180: 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d1a0: 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
d1b0: 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
d1c0: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 49 64              &pId
d1e0: 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29  x, &flags, &nEq)
d1f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73 74  ;.      if( cost
d200: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
d210: 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73         lowestCos
d220: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
d230: 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
d240: 20 20 20 20 20 20 20 20 62 65 73 74 46 6c 61 67          bestFlag
d250: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  s = flags;.     
d260: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
d270: 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a 20  ;.        bestJ 
d280: 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = j;.      }.   
d290: 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d     if( (pTabItem
d2a0: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
d2b0: 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
d2c0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  !=0.         || 
d2d0: 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  (j>0 && (pTabIte
d2e0: 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  m[-1].jointype &
d2f0: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
d300: 53 53 29 29 21 3d 30 29 0a 20 20 20 20 20 20 29  SS))!=0).      )
d310: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
d320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d330: 20 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f     TRACE(("*** O
d340: 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20  ptimizer choose 
d350: 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f  table %d for loo
d360: 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a  p %d\n", bestJ,.
d370: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
d380: 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20  l-pWInfo->a));. 
d390: 20 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67     if( (bestFlag
d3a0: 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
d3b0: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  Y)!=0 ){.      *
d3c0: 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
d3d0: 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
d3e0: 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  s &= bestFlags;.
d3f0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67      pLevel->flag
d400: 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20  s = bestFlags;. 
d410: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20     pLevel->pIdx 
d420: 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65  = pBest;.    pLe
d430: 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e  vel->nEq = bestN
d440: 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  Eq;.    pLevel->
d450: 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  aInLoop = 0;.   
d460: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30   pLevel->nIn = 0
d470: 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20  ;.    if( pBest 
d480: 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
d490: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
d4a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
d4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
d4c0: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31  el->iIdxCur = -1
d4d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
d4e0: 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
d4f0: 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (&maskSet, pTabL
d500: 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43  ist->a[bestJ].iC
d510: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76  ursor);.    pLev
d520: 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74  el->iFrom = best
d530: 4a 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28  J;.  }.  TRACE((
d540: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
d550: 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
d560: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
d570: 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
d580: 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
d590: 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
d5a0: 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
d5b0: 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
d5c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
d5d0: 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
d5e0: 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
d5f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
d600: 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
d610: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
d620: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
d630: 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
d640: 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
d650: 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
d660: 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
d670: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
d680: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
d690: 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
d6a0: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
d6b0: 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
d6c0: 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20  o */.  pLevel = 
d6d0: 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72  pWInfo->a;.  for
d6e0: 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
d6f0: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
d700: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
d710: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
d720: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
d730: 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
d740: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
d750: 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  x;      /* Index
d760: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
d770: 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f  pTab (if any) */
d780: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
d790: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
d7a0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
d7b0: 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
d7c0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  x */.    int iId
d7d0: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
d7e0: 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66  IdxCur;..#ifndef
d7f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d800: 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
d810: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
d820: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
d830: 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
d840: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d850: 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
d860: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
d870: 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
d880: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d890: 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74  ("TABLE %s", pIt
d8a0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
d8b0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
d8c0: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ias ){.        z
d8d0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
d8e0: 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73 22 2c  intf("%z AS %s",
d8f0: 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
d900: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
d910: 20 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20       if( (pIx = 
d920: 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
d930: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
d940: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d950: 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58  f("%z WITH INDEX
d960: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d   %s", zMsg, pIx-
d970: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
d980: 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
d990: 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
d9a0: 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
d9b0: 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
d9c0: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
d9d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
d9e0: 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
d9f0: 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
da00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
da10: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 45  3VdbeOp3(v, OP_E
da20: 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65  xplain, i, pLeve
da30: 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l->iFrom, zMsg, 
da40: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
da50: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
da60: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
da70: 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d   */.    pTabItem
da80: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
da90: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
daa0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
dab0: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
dac0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
dad0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
dae0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
daf0: 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ema);.    if( pT
db00: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
db10: 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
db20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
db30: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
db40: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
db50: 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
db60: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
db70: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
db80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
db90: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
dba0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28  Read);.      if(
dbb0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a   pTab->nCol<(siz
dbc0: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 29 20  eof(Bitmask)*8) 
dbd0: 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
dbe0: 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
dbf0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
dc00: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
dc10: 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
dc20: 62 3e 3e 31 2c 20 6e 2b 2b 29 3b 0a 20 20 20 20  b>>1, n++);.    
dc30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dc40: 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74  hangeP2(v, sqlit
dc50: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
dc60: 72 28 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20 20  r(v)-1, n);.    
dc70: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
dc80: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
dc90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
dca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
dcb0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
dcc0: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
dcd0: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
dce0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
dcf0: 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61  l->iTabCur = pTa
dd00: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
dd10: 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70      if( (pIx = p
dd20: 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20  Level->pIdx)!=0 
dd30: 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
dd40: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
dd50: 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
dd60: 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
dd70: 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
dd80: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
dd90: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
dda0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ddb0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
ddc0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  b, 0);.      Vdb
ddd0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
dde0: 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
ddf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
de00: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
de10: 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
de20: 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20   pIx->tnum,.    
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33   (char*)pKey, P3
de50: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
de60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
de70: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
de80: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
de90: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
dea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
deb0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
dec0: 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78  ns, iIdxCur, pIx
ded0: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20  ->nColumn+1);.  
dee0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
def0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
df00: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
df10: 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
df20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
df30: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
df40: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
df50: 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
df60: 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
df70: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
df80: 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
df90: 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
dfa0: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
dfb0: 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
dfc0: 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
dfd0: 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
dfe0: 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
dff0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
e000: 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
e010: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
e020: 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
e030: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
e040: 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
e050: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f  tem->iCursor;  /
e060: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
e070: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
e080: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
e090: 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  dx;       /* The
e0a0: 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
e0b0: 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
e0c0: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
e0d0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
e0e0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
e0f0: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d  ex */.    int om
e100: 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20  itTable;     /* 
e110: 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
e120: 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
e130: 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20  .    int bRev;  
e140: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e150: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
e160: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
e170: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62  der */..    pTab
e180: 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
e190: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
e1a0: 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70  m];.    iCur = p
e1b0: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
e1c0: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ;.    pIdx = pLe
e1d0: 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69  vel->pIdx;.    i
e1e0: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
e1f0: 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52  >iIdxCur;.    bR
e200: 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  ev = (pLevel->fl
e210: 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
e220: 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69  RSE)!=0;.    omi
e230: 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c  tTable = (pLevel
e240: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
e250: 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20  IDX_ONLY)!=0;.. 
e260: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
e270: 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
e280: 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
e290: 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
e2a0: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
e2b0: 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
e2c0: 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65  mp to brk to bre
e2d0: 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
e2e0: 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  ..    ** Jump to
e2f0: 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
e300: 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
e310: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
e320: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70   the.    ** loop
e330: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b  ..    */.    brk
e340: 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d   = pLevel->brk =
e350: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e360: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f  Label(v);.    co
e370: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
e380: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
e390: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
e3a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e3b0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
e3c0: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
e3d0: 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
e3e0: 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  nd.    ** initia
e3f0: 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
e400: 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
e410: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
e420: 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a  tches any.    **
e430: 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
e440: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
e450: 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
e460: 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
e470: 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
e480: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
e490: 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
e4a0: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
e4b0: 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e  >nMem ) pParse->
e4c0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  nMem++;.      pL
e4d0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
e4e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
e4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e510: 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65 6c  emInt, 0, pLevel
e520: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
e530: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e540: 28 76 2c 20 22 23 20 69 6e 69 74 20 4c 45 46 54  (v, "# init LEFT
e550: 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
e560: 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  lag"));.    }.. 
e570: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
e580: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
e590: 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ID_EQ ){.      /
e5a0: 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
e5b0: 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
e5c0: 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
e5d0: 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20  w using an.     
e5e0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
e5f0: 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
e600: 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
e610: 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
e620: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
e630: 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
e640: 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
e650: 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
e660: 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  .)".      **    
e670: 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
e680: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e690: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
e6a0: 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
e6b0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
e6c0: 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20  WO_IN, 0);.     
e6d0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
e6e0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
e6f0: 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
e700: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
e710: 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  rt( pTerm->leftC
e720: 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
e730: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
e740: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
e750: 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
e760: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
e770: 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b  m, brk, pLevel);
e780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e790: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
e7a0: 73 74 42 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29  stBeInt, 1, brk)
e7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e7c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e7d0: 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
e7e0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  brk);.      Vdbe
e7f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
e800: 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ));.      pLevel
e810: 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
e820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
e830: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e840: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
e850: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
e860: 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
e870: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
e880: 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
e890: 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
e8a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
e8b0: 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
e8c0: 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  op;.      int st
e8d0: 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65  art;.      Where
e8e0: 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
e8f0: 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  End;..      asse
e900: 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
e910: 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74   );.      pStart
e920: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
e930: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
e940: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
e950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64  , 0);.      pEnd
e960: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
e970: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
e980: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
e990: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
e9a0: 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
e9b0: 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
e9c0: 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d          pStart =
e9d0: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70   pEnd;.        p
e9e0: 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
e9f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ea00: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
ea10: 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
ea20: 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
ea30: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
ea40: 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
ea50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ea60: 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73  pStart->leftCurs
ea70: 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
ea80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ea90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
eaa0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
eab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eac0: 70 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74  p(v, OP_ForceInt
ead0: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  , pX->op==TK_LE 
eae0: 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
eaf0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
eb00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eb10: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f  (v, bRev ? OP_Mo
eb20: 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65  veLt : OP_MoveGe
eb30: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
eb40: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
eb50: 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
eb60: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
eb70: 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
eb80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
eb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eba0: 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
ebb0: 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
ebc0: 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
ebd0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
ebe0: 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
ebf0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
ec00: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e          pX = pEn
ec10: 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
ec20: 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
ec30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ec40: 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  t( pEnd->leftCur
ec50: 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ec70: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
ec80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
ec90: 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
eca0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
ecb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ecc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ecd0: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
ece0: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
ecf0: 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
ed00: 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
ed10: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
ed20: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
ed30: 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
ed40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
ed50: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
ed60: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
ed70: 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 69 73     }.        dis
ed90: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
eda0: 20 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a   pEnd);.      }.
edb0: 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
edc0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
edd0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70  Addr(v);.      p
ede0: 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
edf0: 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
ee00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
ee10: 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
ee20: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
ee30: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  = start;.      i
ee40: 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
ee50: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  op ){.        sq
ee60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ee70: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
ee80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
ee90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
eea0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
eeb0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
eec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74  dbeAddOp(v, test
eee0: 4f 70 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  Op, SQLITE_AFF_N
eef0: 55 4d 45 52 49 43 2c 20 62 72 6b 29 3b 0a 20 20  UMERIC, brk);.  
ef00: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
ef10: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
ef20: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
ef30: 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
ef40: 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65 20 57  /* Case 3: The W
ef50: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
ef60: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
ef70: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
ef80: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
ef90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
efa0: 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61  dex is an inequa
efb0: 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70  lity.  For examp
efc0: 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  le, if.      ** 
efd0: 20 20 20 20 20 20 20 20 74 68 65 20 69 6e 64 65          the inde
efe0: 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20  x is on (x,y,z) 
eff0: 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63 6c  and the WHERE cl
f000: 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20  ause is of the. 
f010: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f020: 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c  form "x=5 AND y<
f030: 31 30 22 20 74 68 65 6e 20 74 68 69 73 20 63 61  10" then this ca
f040: 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c  se is used.  Onl
f050: 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20  y the.      **  
f060: 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73         right-mos
f070: 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
f080: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
f090: 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
f0a0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
f0b0: 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
f0c0: 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a  "IN" operators..
f0d0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f0e0: 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
f0f0: 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
f100: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
f110: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
f120: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
f130: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
f140: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
f150: 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
f160: 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
f170: 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
f180: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
f190: 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
f1a0: 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
f1b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
f1c0: 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
f1d0: 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
f1e0: 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f  Eq;.      int to
f1f0: 70 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a  pEq=0;        /*
f200: 20 54 72 75 65 20 69 66 20 74 6f 70 20 6c 69 6d   True if top lim
f210: 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73  it uses ==. Fals
f220: 65 20 69 73 20 73 74 72 69 63 74 6c 79 20 3c 20  e is strictly < 
f230: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d  */.      int btm
f240: 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  Eq=0;        /* 
f250: 54 72 75 65 20 69 66 20 62 74 6d 20 6c 69 6d 69  True if btm limi
f260: 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65  t uses ==. False
f270: 20 69 66 20 73 74 72 69 63 74 6c 79 20 3e 20 2a   if strictly > *
f280: 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4f  /.      int topO
f290: 70 2c 20 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f  p, btmOp;   /* O
f2a0: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
f2b0: 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   top and bottom 
f2c0: 73 65 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f  search bounds */
f2d0: 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
f2e0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  p;.      int nNo
f2f0: 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  tNull;       /* 
f300: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  Number of rows o
f310: 66 20 69 6e 64 65 78 20 74 68 61 74 20 6d 75 73  f index that mus
f320: 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f  t be non-NULL */
f330: 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69  .      int topLi
f340: 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
f350: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
f360: 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20  _LIMIT)!=0;.    
f370: 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d    int btmLimit =
f380: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
f390: 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
f3a0: 54 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  T)!=0;..      /*
f3b0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
f3c0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
f3d0: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
f3e0: 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
f3f0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65       ** and leve
f400: 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  l the values of 
f410: 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74  those terms on t
f420: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20  he stack..      
f430: 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c  */.      codeAll
f440: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
f450: 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77  arse, pLevel, &w
f460: 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b  c, notReady, brk
f470: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70  );..      /* Dup
f480: 6c 69 63 61 74 65 20 74 68 65 20 65 71 75 61 6c  licate the equal
f490: 69 74 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20  ity term values 
f4a0: 62 65 63 61 75 73 65 20 74 68 65 79 20 77 69 6c  because they wil
f4b0: 6c 20 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a  l all be.      *
f4c0: 2a 20 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e  * used twice: on
f4d0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ce to make the t
f4e0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61  ermination key a
f4f0: 6e 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  nd once to make 
f500: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  the.      ** sta
f510: 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  rt key..      */
f520: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
f530: 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
f540: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
f560: 20 6e 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20   nEq-1, 0);.    
f570: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
f580: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 63 6f  gure out what co
f590: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
f5a0: 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20 74 6f  rs to use for to
f5b0: 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20  p and bottom .  
f5c0: 20 20 20 20 2a 2a 20 73 65 61 72 63 68 20 62 6f      ** search bo
f5d0: 75 6e 64 73 2e 20 46 6f 72 20 61 6e 20 61 73 63  unds. For an asc
f5e0: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  ending index, th
f5f0: 65 20 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69  e bottom bound i
f600: 73 20 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20  s a > or >=.    
f610: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e    ** operator an
f620: 64 20 74 68 65 20 74 6f 70 20 62 6f 75 6e 64 20  d the top bound 
f630: 69 73 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65  is a < or <= ope
f640: 72 61 74 6f 72 2e 20 20 46 6f 72 20 61 20 64 65  rator.  For a de
f650: 73 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a  scending.      *
f660: 2a 20 69 6e 64 65 78 20 74 68 65 20 6f 70 65 72  * index the oper
f670: 61 74 6f 72 73 20 61 72 65 20 72 65 76 65 72 73  ators are revers
f680: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
f690: 20 20 20 6e 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 45     nNotNull = nE
f6a0: 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20  q + topLimit;.  
f6b0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
f6c0: 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
f6d0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
f6e0: 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20          topOp = 
f6f0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_LT|WO_LE;.   
f700: 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f       btmOp = WO_
f710: 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
f720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
f730: 6f 70 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  opOp = WO_GT|WO_
f740: 47 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f  GE;.        btmO
f750: 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  p = WO_LT|WO_LE;
f760: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
f770: 74 2c 20 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d  t, topLimit, btm
f780: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
f790: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
f7a0: 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  te the terminati
f7b0: 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73  on key.  This is
f7c0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
f7d0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  hat.      ** wil
f7e0: 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63 68  l end the search
f7f0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74  .  There is no t
f800: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69  ermination key i
f810: 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  f there.      **
f820: 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79   are no equality
f830: 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58   terms and no "X
f840: 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20  <..." term..    
f850: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30    **.      ** 20
f860: 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20  02-Dec-04: On a 
f870: 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
f880: 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65  an, the so-calle
f890: 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a  d "termination".
f8a0: 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d        ** key com
f8b0: 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c  puted here reall
f8c0: 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
f8d0: 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20  the start key.. 
f8e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f8f0: 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ( topLimit ){.  
f900: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
f910: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
f920: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
f930: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f940: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
f950: 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
f960: 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29  dy, topOp, pIdx)
f970: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f980: 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
f990: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
f9a0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
f9b0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
f9c0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
f9d0: 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
f9e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f9f0: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
fa00: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
fa10: 74 6f 70 45 71 20 3d 20 70 54 65 72 6d 2d 3e 6f  topEq = pTerm->o
fa20: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
fa30: 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20  |WO_GE);.       
fa40: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
fa50: 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  vel, pTerm);.   
fa60: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50       testOp = OP
fa70: 5f 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d 65  _IdxGE;.      }e
fa80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
fa90: 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f 20 4f 50  tOp = nEq>0 ? OP
faa0: 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70  _IdxGE : OP_Noop
fab0: 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71 20  ;.        topEq 
fac0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
fad0: 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
fae0: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
faf0: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71    int nCol = nEq
fb00: 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20   + topLimit;.   
fb10: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
fb20: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
fb30: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c  ++;.        buil
fb40: 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e  dIndexProbe(v, n
fb50: 43 6f 6c 2c 20 6e 45 71 2c 20 62 72 6b 2c 20 70  Col, nEq, brk, p
fb60: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
fb70: 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
fb80: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f 70      int op = top
fb90: 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a  Eq ? OP_MoveLe :
fba0: 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20   OP_MoveLt;.    
fbb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fbc0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49  eAddOp(v, op, iI
fbd0: 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
fbe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
fc10: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
fc20: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Mem, 1);.       
fc30: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
fc40: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
fc50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc60: 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  dOp(v, OP_Last, 
fc70: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
fc80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fc90: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 74   Generate the st
fca0: 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69  art key.  This i
fcb0: 73 20 74 68 65 20 6b 65 79 20 74 68 61 74 20 64  s the key that d
fcc0: 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72  efines the lower
fcd0: 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20  .      ** bound 
fce0: 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  on the search.  
fcf0: 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72  There is no star
fd00: 74 20 6b 65 79 20 69 66 20 74 68 65 72 65 20 61  t key if there a
fd10: 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65  re no.      ** e
fd20: 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e  quality terms an
fd30: 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  d if there is no
fd40: 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20   "X>..." term.  
fd50: 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  In.      ** that
fd60: 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20   case, generate 
fd70: 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72  a "Rewind" instr
fd80: 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20  uction in place 
fd90: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
fda0: 73 74 61 72 74 20 6b 65 79 20 73 65 61 72 63 68  start key search
fdb0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
fdc0: 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
fdd0: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
fde0: 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  a reverse-order 
fdf0: 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63  search, the so-c
fe00: 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22  alled.      ** "
fe10: 73 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c  start" key reall
fe20: 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
fe30: 75 73 65 64 20 61 73 20 74 68 65 20 74 65 72 6d  used as the term
fe40: 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20  ination key..   
fe50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
fe60: 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
fe70: 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
fe80: 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
fe90: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
fea0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
feb0: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
fec0: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
fed0: 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b 0a  , btmOp, pIdx);.
fee0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fef0: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
ff00: 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
ff10: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
ff20: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
ff30: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
ff40: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
ff50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ff60: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
ff70: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 62 74  ght);.        bt
ff80: 6d 45 71 20 3d 20 70 54 65 72 6d 2d 3e 6f 70 65  mEq = pTerm->ope
ff90: 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
ffa0: 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64  O_GE);.        d
ffb0: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
ffc0: 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  l, pTerm);.     
ffd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffe0: 62 74 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  btmEq = 1;.     
fff0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
10000 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29  >0 || btmLimit )
10010 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
10020 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69  ol = nEq + btmLi
10030 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 62 75 69  mit;.        bui
10040 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
10050 6e 43 6f 6c 2c 20 30 2c 20 62 72 6b 2c 20 70 49  nCol, 0, brk, pI
10060 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
10070 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
10080 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
10090 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
100a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
100b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
100c0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
100d0 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
100e0 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
100f0 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20  = OP_IdxLT;.    
10100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10110 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74       int op = bt
10120 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20  mEq ? OP_MoveGe 
10130 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  : OP_MoveGt;.   
10140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10150 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
10160 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
10170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10180 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
10190 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
101a0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
101b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
101c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
101d0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49  v, OP_Rewind, iI
101e0 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
101f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
10200 65 6e 65 72 61 74 65 20 74 68 65 20 74 68 65 20  enerate the the 
10210 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  top of the loop.
10220 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20    If there is a 
10230 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20  termination.    
10240 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65    ** key we have
10250 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61   to test for tha
10260 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20  t key and abort 
10270 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
10280 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e  e.      ** loop.
10290 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
102a0 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
102b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
102c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  );.      if( tes
102d0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
102e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
102f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
10300 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
10310 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
10320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10330 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49  Op(v, testOp, iI
10340 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
10350 20 20 20 20 20 69 66 28 20 28 74 6f 70 45 71 20       if( (topEq 
10360 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62  && !bRev) || (!b
10370 74 6d 45 71 20 26 26 20 62 52 65 76 29 20 29 7b  tmEq && bRev) ){
10380 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10390 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
103a0 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54  , -1, "+", P3_ST
103b0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
103c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
103d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
103e0 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49  v, OP_RowKey, iI
103f0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
10400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10410 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c  p(v, OP_IdxIsNul
10420 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c 20 63 6f 6e  l, nNotNull, con
10430 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f  t);.      if( !o
10440 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
10450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10460 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
10470 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29  wid, iIdxCur, 0)
10480 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10490 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
104a0 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
104b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
104c0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
104d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
104e0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
104f0 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  e loop..      */
10500 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
10510 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
10520 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
10530 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
10540 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
10550 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
10560 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
10570 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
10580 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
10590 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  Q ){.      /* Ca
105a0 73 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20  se 4:  There is 
105b0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c  an index and all
105c0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
105d0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
105e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
105f0 20 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69    refer to the i
10600 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22  ndex using the "
10610 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
10620 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ators..      */.
10630 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
10640 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
10650 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20   pLevel->nEq;.. 
10660 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10670 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
10680 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
10690 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
106a0 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61  or IN.      ** a
106b0 6e 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c  nd leave the val
106c0 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
106d0 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ms on the stack.
106e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
106f0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
10700 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
10710 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
10720 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20  dy, brk);..     
10730 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
10740 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77  ingle key that w
10750 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62  ill be used to b
10760 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65  oth start and te
10770 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a  rminate.      **
10780 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
10790 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64    */.      build
107a0 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45  IndexProbe(v, nE
107b0 71 2c 20 30 2c 20 62 72 6b 2c 20 70 49 64 78 29  q, 0, brk, pIdx)
107c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
107d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
107e0 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
107f0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20  >iMem, 0);..    
10800 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
10810 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74  de (1) to move t
10820 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  o the first matc
10830 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
10840 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
10850 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74   ** Then generat
10860 65 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20  e code (2) that 
10870 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22 20 61  jumps to "brk" a
10880 66 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  fter the cursor 
10890 69 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  is past.      **
108a0 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69   the last matchi
108b0 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
108c0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
108d0 64 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74  de (1) is execut
108e0 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  ed.      ** once
108f0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
10900 68 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63  he search, the c
10910 6f 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75  ode (2) is execu
10920 74 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a  ted before each.
10930 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69        ** iterati
10940 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74  on of the scan t
10950 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61  o see if the sca
10960 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20  n has finished. 
10970 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  */.      if( bRe
10980 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  v ){.        /* 
10990 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
109a0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
109b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109c0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20  p(v, OP_MoveLe, 
109d0 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
109e0 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
109f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10a00 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
10a10 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
10a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10a30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a40 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20  IdxLT, iIdxCur, 
10a50 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  brk);.        pL
10a60 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
10a70 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
10a80 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
10a90 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
10aa0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
10ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ac0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
10ad0 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
10ae0 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
10af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b00 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
10b10 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
10b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b30 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64  VdbeOp3(v, OP_Id
10b40 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20 62 72  xGE, iIdxCur, br
10b50 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  k, "+", P3_STATI
10b60 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  C);.        pLev
10b70 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
10b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ba0 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69  (v, OP_RowKey, i
10bb0 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
10bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10bd0 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75  Op(v, OP_IdxIsNu
10be0 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a  ll, nEq, cont);.
10bf0 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
10c00 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
10c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c20 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
10c30 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
10c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
10c60 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
10c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
10c80 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
10c90 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
10ca0 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
10cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10cc0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
10cd0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
10ce0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
10cf0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
10d00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
10d10 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
10d20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
10d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
10d40 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
10d50 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
10d60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
10d70 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
10d80 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
10d90 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
10da0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
10db0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
10dc0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
10dd0 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
10de0 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
10df0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
10e00 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
10e10 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
10e20 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
10e30 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
10e40 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
10e50 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
10e60 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
10e70 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
10e80 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
10e90 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
10ea0 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
10eb0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
10ec0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
10ed0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
10ee0 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
10ef0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
10f00 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
10f10 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
10f20 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
10f30 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
10f40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
10f50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
10f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10f70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
10f80 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
10f90 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
10fa0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
10fb0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
10fc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10fd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10fe0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
10ff0 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20  arse, pE, cont, 
11000 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  1);.      pTerm-
11010 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
11020 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ODED;.    }..   
11030 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
11040 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
11050 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
11060 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
11070 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ct that.    ** a
11080 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
11090 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
110a0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
110b0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
110c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
110d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
110e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  n ){.      pLeve
110f0 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  l->top = sqlite3
11100 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
11110 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
11120 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11130 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76  _MemInt, 1, pLev
11140 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
11150 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11160 74 28 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20  t((v, "# record 
11170 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
11180 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
11190 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77  m=wc.a, j=0; j<w
111a0 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  c.nTerm; j++, pT
111b0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
111c0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
111d0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
111e0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
111f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11200 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
11210 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
11220 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
11230 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11240 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
11250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11260 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
11270 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
11280 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  r, cont, 1);.   
11290 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
112a0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
112b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
112c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
112d0 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
112e0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
112f0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
11300 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
11310 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
11320 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
11330 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
11340 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
11350 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
11360 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
11370 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
11380 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
11390 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
113a0 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
113b0 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
113c0 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
113d0 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
113e0 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
113f0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
11400 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
11410 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
11420 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11430 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
11440 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
11450 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
11460 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
11470 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
11480 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
11490 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
114a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
114b0 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
114c0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
114d0 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
114e0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
114f0 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
11500 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
11510 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
11520 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
11530 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
11540 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
11550 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
11560 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
11570 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11580 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b  [nQPlan], "{}");
11590 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
115a0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
115b0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  e{.        strcp
115c0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
115d0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
115e0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
115f0 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
11600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
11610 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
11620 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
11630 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
11640 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
11650 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
11660 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
11670 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
11680 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
11690 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20  QPlan], "* ");. 
116a0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
116b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
116c0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
116d0 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ){.      strcpy(
116e0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
116f0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
11700 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   ");.      nQPla
11710 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  n += 3;.    }els
11720 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  e{.      n = str
11730 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78  len(pLevel->pIdx
11740 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
11750 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
11760 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
11770 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
11780 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
11790 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
117a0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
117b0 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
117c0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
117d0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71  += n;.        sq
117e0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
117f0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
11800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11810 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50    }.  while( nQP
11820 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33  lan>0 && sqlite3
11830 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
11840 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  an-1]==' ' ){.  
11850 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
11860 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d  plan[--nQPlan] =
11870 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
11880 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
11890 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c  lan] = 0;.  nQPl
118a0 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f  an = 0;.#endif /
118b0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f  * SQLITE_TEST //
118c0 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   Testing and deb
118d0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
118e0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
118f0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
11900 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
11910 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
11920 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  ure.  Then.  ** 
11930 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  clean up and ret
11940 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  urn..  */.  pWIn
11950 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
11960 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61  cont;.  whereCla
11970 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20  useClear(&wc);. 
11980 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
11990 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
119a0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
119b0 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  */.whereBeginNoM
119c0 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73  em:.  whereClaus
119d0 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 73  eClear(&wc);.  s
119e0 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f  qliteFree(pWInfo
119f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
11a00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11a10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11a20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
11a30 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
11a40 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11a50 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
11a60 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11a70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11a80 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
11a90 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56  fo *pWInfo){.  V
11aa0 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
11ab0 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
11ac0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
11ad0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
11ae0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
11af0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
11b00 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e  bList;..  /* Gen
11b10 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
11b20 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
11b30 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69  /.  for(i=pTabLi
11b40 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30  st->nSrc-1; i>=0
11b50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
11b60 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
11b70 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
11b80 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11b90 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29  v, pLevel->cont)
11ba0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
11bb0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
11bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11bd0 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65  beAddOp(v, pLeve
11be0 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
11bf0 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
11c00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11c10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
11c20 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b  l(v, pLevel->brk
11c30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
11c40 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  l->nIn ){.      
11c50 69 6e 74 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e  int *a;.      in
11c60 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
11c70 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d  =pLevel->nIn, a=
11c80 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  &pLevel->aInLoop
11c90 5b 6a 2a 33 2d 33 5d 3b 20 6a 3e 30 3b 20 6a 2d  [j*3-3]; j>0; j-
11ca0 2d 2c 20 61 2d 3d 33 29 7b 0a 20 20 20 20 20 20  -, a-=3){.      
11cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11cc0 4f 70 28 76 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  Op(v, a[0], a[1]
11cd0 2c 20 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d  , a[2]);.      }
11ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
11cf0 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  e(pLevel->aInLoo
11d00 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
11d10 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
11d20 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
11d30 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
11d40 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11d50 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
11d60 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
11d70 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20  ftJoin, 0);.    
11d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d90 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
11da0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
11db0 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  .iCursor, 0);.  
11dc0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
11dd0 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20  iIdxCur>=0 ){.  
11de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11df0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
11e00 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
11e10 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
11e20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11e30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11e40 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
11e50 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  >top);.      sql
11e60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11e70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
11e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
11e90 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
11ea0 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
11eb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
11ec0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
11ed0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
11ee0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11ef0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
11f00 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
11f10 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
11f20 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
11f30 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
11f40 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
11f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
11f60 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
11f70 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
11f80 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
11f90 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
11fa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
11fb0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
11fc0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
11fd0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
11fe0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
11ff0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
12000 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
12010 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
12020 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62  ransient || pTab
12030 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
12040 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
12050 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
12060 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
12070 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12080 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12090 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
120a0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a  m->iCursor, 0);.
120b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
120c0 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b  evel->pIdx!=0 ){
120d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
120e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
120f0 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
12100 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  xCur, 0);.    }.
12110 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72  .    /* Make cur
12120 73 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e  sor substitution
12130 73 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 72  s for cases wher
12140 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73 65  e we want to use
12150 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68 65  .    ** just the
12160 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65 72   index and never
12170 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
12180 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  able..    ** .  
12190 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
121a0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
121b0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
121c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
121d0 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
121e0 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
121f0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
12200 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
12210 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12220 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
12230 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
12240 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
12250 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
12260 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
12270 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
12280 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
12290 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
122a0 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
122b0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
122c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
122d0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
122e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_IDX_ONLY ){. 
122f0 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c       int i, j, l
12300 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
12310 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
12320 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
12330 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20  el->pIdx;..     
12340 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
12350 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   );.      pOp = 
12360 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
12370 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
12380 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
12390 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
123a0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
123b0 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69   for(i=pWInfo->i
123c0 54 6f 70 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b  Top; i<last; i++
123d0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
123e0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
123f0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
12400 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12410 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
12420 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
12430 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
12440 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
12450 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
12460 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
12470 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
12480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12490 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61  pOp->p2==pIdx->a
124a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20  iColumn[j] ){.  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
124c0 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  >p2 = j;.       
124d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
124e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
124f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12500 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
12510 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
12520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
12530 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
12540 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
12550 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
12560 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
12570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
12580 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
12590 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
125a0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
125b0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
125c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
125d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
125e0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
125f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49    sqliteFree(pWI
12600 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
12610 7d 0a                                            }.