/ Hex Artifact Content
Login

Artifact c7d50e26bad54218d8fa109d3127b9769b9474ab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
05a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
05b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
05c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
05d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
05e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
05f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
0660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
0670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
06a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
06b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
06c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
06d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
06e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
06f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
0700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
0710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
0720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
0730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
0740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
0750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
0760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
0770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
0780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
0790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
07a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
07b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
07c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
07d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
07e0: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  results..**.** I
07f0: 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  f the ONEPASS op
0800: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
0810: 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74  ed (if this rout
0820: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
0830: 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77  ).** then also w
0840: 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73  rite the indices
0850: 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   of open cursors
0860: 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53   used by ONEPASS
0870: 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30  .** into aiCur[0
0880: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20  ] and aiCur[1]. 
0890: 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74   iaCur[0] gets t
08a0: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
08b0: 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61   data.** table a
08c0: 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73  nd iaCur[1] gets
08d0: 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
08e0: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
08f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65   index..** Eithe
0900: 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d  r value may be -
0910: 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
0920: 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  at cursor is not
0930: 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75   used..** Any cu
0940: 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77  rsors returned w
0950: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ill have been op
0960: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
0970: 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d  ..**.** aiCur[0]
0980: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f   and aiCur[1] bo
0990: 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65  th get -1 if the
09a0: 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f   where-clause lo
09b0: 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65  gic is.** unable
09c0: 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50   to use the ONEP
09d0: 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
09e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
09f0: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57  WhereOkOnePass(W
0a00: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
0a10: 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20  , int *aiCur){. 
0a20: 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70   memcpy(aiCur, p
0a30: 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
0a40: 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  ass, sizeof(int)
0a50: 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  *2);.  return pW
0a60: 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b  Info->okOnePass;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0a80: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0a90: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ab0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ac0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ad0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0ae0: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0af0: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0b00: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0b10: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0b20: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0b40: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0b50: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0b60: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0b70: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0b80: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0b90: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0ba0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0bb0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0bc0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0bd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
0be0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
0bf0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
0c00: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
0c10: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
0c20: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
0c30: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
0c40: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
0c50: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
0c60: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
0c70: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
0c80: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
0c90: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
0ca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0cb0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
0cc0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
0cd0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0ce0: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
0d00: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
0d10: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
0d20: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
0d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d40: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
0d50: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
0d60: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
0d70: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
0d80: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
0d90: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
0da0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
0db0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
0dc0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
0dd0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
0de0: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
0df0: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
0e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
0e10: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
0e20: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
0e30: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
0e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0e60: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
0e70: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
0e80: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
0e90: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
0ea0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
0eb0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
0ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0ed0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
0ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
0ef0: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
0f00: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
0f10: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
0f20: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
0f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0f40: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
0f50: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
0f60: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
0f70: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
0f80: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
0f90: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
0fb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
0fc0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
0fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0fe0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
0ff0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1000: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
1010: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1020: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
1030: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
1040: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
1050: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20  eInfo *pWInfo   
1060: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1070: 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  E processing con
1080: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  text */.){.  pWC
1090: 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  ->pWInfo = pWInf
10a0: 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  o;.  pWC->pOuter
10b0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
10c0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
10d0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
10e0: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
10f0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
1100: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
1110: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1120: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1130: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1140: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
1150: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1160: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
1170: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
1180: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
1190: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11a0: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
11b0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
11c0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
11d0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
11e0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
11f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
1210: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
1220: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1230: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
1240: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
1250: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
1260: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
1270: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1280: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
1290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
12a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
12b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
12d0: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
12e0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
12f0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1300: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1310: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1330: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1360: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1370: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1380: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
13a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
13c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69  rse->db;.  for(i
13d0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
13e0: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
13f0: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
1400: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
1410: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1430: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45  Delete(db, a->pE
1440: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
1450: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
1460: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a   TERM_ORINFO ){.
1470: 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66        whereOrInf
1480: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
1490: 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  .pOrInfo);.    }
14a0: 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c  else if( a->wtFl
14b0: 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e  ags & TERM_ANDIN
14c0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
14d0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64  eAndInfoDelete(d
14e0: 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  b, a->u.pAndInfo
14f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1500: 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e  f( pWC->a!=pWC->
1510: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73  aStatic ){.    s
1520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1530: 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a   pWC->a);.  }.}.
1540: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
1550: 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  gle new WhereTer
1560: 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57  m entry to the W
1570: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1580: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65  t pWC..** The ne
1590: 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  w WhereTerm obje
15a0: 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  ct is constructe
15b0: 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e  d from Expr p an
15c0: 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a  d with wtFlags..
15d0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20  ** The index in 
15e0: 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  pWC->a[] of the 
15f0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73  new WhereTerm is
1600: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1610: 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65  cess..** 0 is re
1620: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65  turned if the ne
1630: 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c  w WhereTerm coul
1640: 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64  d not be added d
1650: 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a  ue to a memory.*
1660: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
1670: 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  or.  The memory 
1680: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1690: 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  re will be recor
16a0: 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62  ded in.** the db
16b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
16c0: 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68  lag so that high
16d0: 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f  er-level functio
16e0: 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74  ns can detect it
16f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1700: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  tine will increa
1710: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
1720: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
1730: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
1740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46  **.** If the wtF
1750: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
1760: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
1770: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
1780: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
1790: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
17a0: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
17b0: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
17c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
17d0: 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72  C..** This is tr
17e0: 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  ue even if this 
17f0: 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f  routine fails to
1800: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1810: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
1820: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
1830: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1840: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
1850: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
1860: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
1870: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
1880: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
1890: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ld be invalidate
18a0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
18b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
18c0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
18d0: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
18e0: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
18f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
1900: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
1910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
1920: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
1930: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
1940: 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73  r *p, u8 wtFlags
1950: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1960: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1970: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
1980: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1990: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
19e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
19f0: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a00: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a30: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a40: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a50: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a60: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ad0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1ae0: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1af0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b00: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b10: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b20: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b40: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b50: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b70: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1b80: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1b90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
1ba0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
1bb0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
1bc0: 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61   if( p && ExprHa
1bd0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1be0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
1bf0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
1c00: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  b = sqlite3LogEs
1c10: 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39  t(p->iTable) - 9
1c20: 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  9;.  }else{.    
1c30: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c40: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
1c50: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
1c60: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c70: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
1c80: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
1c90: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
1ca0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
1cb0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
1cc0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
1cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
1cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
1d20: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
1d30: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
1d40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
1d50: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
1d60: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
1d70: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
1d80: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
1d90: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1da0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
1db0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
1dc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1de0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1df0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1e00: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1e10: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1e20: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1e30: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1e40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e50: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1e70: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1e80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1e90: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1ea0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1ec0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1ed0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1ee0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1ef0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1f00: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
1f10: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
1f20: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
1f30: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
1f40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1f50: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
1f60: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
1f70: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
1f80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
1f90: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
1fa0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
1fb0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
1fc0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
1fd0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1fe0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1ff0: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
2000: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2010: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
2020: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
2030: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
2040: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2050: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2060: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
2070: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2080: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
20a0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
20b0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
20c0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
20d0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
20e0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
20f0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2100: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
2110: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
2120: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
2130: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
2140: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
2150: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
2160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
2170: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
2180: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
2190: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
21a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
21b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
21c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
21d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
21e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
21f0: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
2200: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
2210: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
2220: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
2230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
2240: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
2250: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
2260: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2280: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2290: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
22a0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
22b0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
22c0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
22d0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
22e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
22f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2310: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2320: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2330: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2340: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2350: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2360: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2370: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2380: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2390: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
23a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
23b0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
23c0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
23d0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
23e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
23f0: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2400: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2410: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2420: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2430: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2440: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2450: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
2460: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
2470: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
2480: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
2490: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
24a0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
24b0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
24c0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
24e0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
24f0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2500: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2510: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2520: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2530: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2540: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2550: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2560: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
2570: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2580: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
25a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
25b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
25c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
25d0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
25e0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2600: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2610: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2620: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2630: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2640: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2660: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
2670: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2680: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2690: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
26a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
26b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
26d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
26e0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
26f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2700: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
2710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2720: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2730: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2740: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2750: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2760: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2780: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2790: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
27b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27c0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
27d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
27e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
27f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2810: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2840: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2850: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
2860: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2870: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
2880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2890: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
28a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
28b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
28c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
28d0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
28e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
28f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2900: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
2940: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2950: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2960: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
2970: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
2980: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2990: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
29a0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
29b0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
29c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29e0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
2a00: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
2a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2a20: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
2a30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2a40: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
2a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a80: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
2a90: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
2aa0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
2ab0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
2ad0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2ae0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2af0: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2b00: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2b20: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2b30: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2b40: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2b50: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
2b60: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
2b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2b80: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
2b90: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
2ba0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
2bb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2bc0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
2bd0: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
2be0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
2bf0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
2c00: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
2c10: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
2c20: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
2c30: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
2c40: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
2c50: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
2c60: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
2c70: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
2c80: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
2c90: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
2ca0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
2cb0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
2cc0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
2cd0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2ce0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
2cf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2d00: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
2d10: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
2d20: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
2d30: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
2d40: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
2d50: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
2d60: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
2d70: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
2d80: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
2d90: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
2da0: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
2db0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
2dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dd0: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
2de0: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
2df0: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
2e00: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
2e10: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
2e20: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
2e30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
2e40: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
2e50: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
2e60: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
2e70: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
2e80: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
2e90: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
2ea0: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
2eb0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
2ec0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
2ed0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
2ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ef0: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
2f00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2f10: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
2f20: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
2f30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2f40: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
2f50: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
2f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
2f70: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
2f80: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
2f90: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
2fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
2fb0: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
2fc0: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
2fd0: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
2fe0: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
2ff0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3000: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
3010: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
3020: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
3030: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
3040: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3050: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
3060: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
3070: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
3080: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
3090: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
30a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
30b0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
30c0: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
30d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
30e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3100: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
3110: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
3120: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
3130: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
3140: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
3150: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
3160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3170: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
3180: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
3190: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
31a0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
31b0: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
31c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
31d0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
31e0: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
31f0: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
3200: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
3210: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
3220: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3230: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
3240: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
3250: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
3260: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
3270: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
3280: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
3290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32a0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
32b0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
32c0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
32d0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
32e0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
32f0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
3300: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
3310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
3320: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
3330: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
3340: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
3350: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
3360: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
3370: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
3380: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
3390: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
33a0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
33b0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
33c0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
33d0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
33e0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
33f0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
3400: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
3410: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
3420: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
3430: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
3440: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3450: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3460: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3470: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3480: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
34a0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
34f0: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3510: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3530: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3540: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3550: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
3560: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
3570: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
3580: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
3590: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
35a0: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
35b0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
35d0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
35e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
35f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
3600: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
3610: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
3620: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3630: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
3640: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
3650: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
3660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
3670: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
3680: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
3690: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
36a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
36b0: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
36c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
36d0: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
36e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
36f0: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
3700: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
3710: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3720: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
3730: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
3740: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
3750: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
3760: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
3770: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
3780: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
3790: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
37a0: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
37b0: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
37c0: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
37d0: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
37e0: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
37f0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
3800: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
3810: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3820: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
3830: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
3840: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
3850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
3860: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
3870: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
3880: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
3890: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
38a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
38b0: 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  r.         && pT
38c0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
38d0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38e0: 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69      && (pScan->i
38f0: 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70  Equiv<=2 || !Exp
3900: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
3910: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
3920: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20  omJoin)).       
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3940: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3950: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
3960: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
3970: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
3980: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
3990: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
39a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
39b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
39c0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
39d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
39e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
39f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3a10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
3a30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
3a40: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
3a50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3a60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
3a70: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
3a80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
3a90: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
3aa0: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3af0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
3b00: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
3b10: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b20: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
3b30: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
3b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
3b50: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
3b60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
3b70: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
3b80: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
3b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3bb0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
3bc0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
3bd0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
3bf0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
3c00: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
3c10: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3c30: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
3c40: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3c50: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
3c60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3c70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3c90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
3ca0: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
3cb0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
3cc0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
3cd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
3ce0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
3cf0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
3d00: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
3d10: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
3d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d50: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
3d60: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
3d70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3d80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
3d90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
3de0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
3df0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
3e00: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
3e10: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
3e20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3e40: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3e50: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
3e60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
3e70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3e80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3eb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ec0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ee0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ef0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
3f00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
3f10: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
3f20: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
3f30: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
3f40: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
3f50: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
3f60: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3f80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fa0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
3fb0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
3fc0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
3fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
4010: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
4020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4030: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4040: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
4050: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
4060: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
4070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4080: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4090: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
40a0: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
40b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
40c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
40d0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
40e0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
40f0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
4100: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
4110: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
4120: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
4130: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
4140: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
4150: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
4160: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
4170: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
4180: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4190: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
41a0: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
41b0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
41c0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
41d0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
41e0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
41f0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
4200: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
4210: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
4220: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
4240: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
4250: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4260: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
4270: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
4280: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
4290: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
42a0: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
42b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
42c0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
42d0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
42e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
42f0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
4300: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4310: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
4320: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4330: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
4350: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
4360: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
4370: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4380: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
4390: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
43a0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
43b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
43c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
43d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
43e0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
43f0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
4400: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
4410: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
4420: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
4450: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4470: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
4480: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
4490: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
44a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
44b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
44c0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
44d0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
44e0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
44f0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
4500: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
4510: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
4520: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
4530: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
4540: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
4550: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
4560: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4570: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4580: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
4590: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
45a0: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
45b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
45c0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b  EVER(j>=pIdx->nK
45d0: 65 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20  eyCol) ) return 
45e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
45f0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
4610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
4620: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4640: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
4650: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
4660: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
4670: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
4680: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
4690: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
46a0: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
46c0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
46d0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
46e0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
46f0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
4700: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
4710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
4720: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
4730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4740: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
4750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
4760: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
4770: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
4780: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
4790: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
47a0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
47b0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
47c0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
47d0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
47e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
47f0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
4800: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
4810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
4820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
4830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
4840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
4850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
4860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
4880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
4890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
48a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
48b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
48c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
48d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
48e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
48f0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
4900: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
4910: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
4920: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
4930: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
4940: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
4950: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
4960: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
4970: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
4980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
4990: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
49a0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
49b0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
49c0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
49d0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
49e0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
49f0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
4a00: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
4a10: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
4a20: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
4a30: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
4a40: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
4a50: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
4a60: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
4a70: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
4a80: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
4a90: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
4aa0: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
4ab0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
4ac0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4ad0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
4ae0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
4af0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
4b00: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
4b10: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
4b20: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
4b30: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4b40: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
4b50: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
4b60: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
4b70: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b80: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
4b90: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
4ba0: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
4bb0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
4bc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
4bd0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
4be0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
4bf0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
4c00: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
4c10: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
4c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
4c30: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
4c40: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4c50: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
4c60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4c70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
4c80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
4c90: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
4ca0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4cb0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
4cc0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
4cd0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4ce0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4d10: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
4d20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
4d30: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
4d40: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4d60: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
4d70: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
4d80: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
4d90: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
4da0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
4db0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
4dc0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
4dd0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
4de0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
4df0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
4e00: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
4e10: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
4e20: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
4e30: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
4e40: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
4e50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
4e60: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
4e70: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
4e80: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
4e90: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
4ea0: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
4eb0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
4ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4ed0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
4ee0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
4ef0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
4f00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
4f10: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
4f20: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
4f30: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
4f40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4f50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
4f60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
4f70: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
4f80: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
4f90: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
4fa0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
4fb0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
4fc0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
4fd0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fe0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
4ff0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5000: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5010: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5020: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5030: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5040: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5050: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5060: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5070: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5080: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5090: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
50a0: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
50b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50c0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
50d0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
50e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
50f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5100: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5110: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5120: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5130: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5140: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5150: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5160: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5170: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5180: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5190: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
51a0: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
51b0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
51c0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
51d0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
51e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
51f0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5210: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5220: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5230: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5240: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5250: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5260: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5270: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5280: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5290: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
52a0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
52b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
52c0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
52d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
52e0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
52f0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5300: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5310: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5320: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5330: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5340: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5350: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5360: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5380: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5390: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
53a0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
53c0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
53d0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
53e0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
53f0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5400: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5410: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5420: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5430: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5440: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5470: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5480: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
54a0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
54b0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
54c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
54d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
54e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
54f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
5500: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5510: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5540: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5550: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5570: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5580: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5590: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
55a0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
55b0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
55c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
55d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
55e0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
55f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5600: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5610: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5620: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5640: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5650: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
5660: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5670: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
5680: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
5690: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
56a0: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
56b0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
56c0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
56d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
56e0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
56f0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
5700: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
5710: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
5720: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
5730: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
5740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
5750: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
5760: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
5770: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
5780: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
5790: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
57a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
57b0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57c0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57d0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
57e0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
57f0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
5800: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
5810: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
5820: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
5830: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
5840: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
5850: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
5860: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
5870: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
5880: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5890: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
58a0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
58b0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
58c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
58d0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
58e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
58f0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
5900: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
5910: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5920: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5930: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
5940: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
5950: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5960: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
5970: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5980: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
5990: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
59a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
59b0: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
59c0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
59d0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
59e0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
59f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
5a00: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
5a10: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
5a20: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
5a30: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
5a40: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
5a50: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5a60: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
5a70: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
5a80: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
5a90: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
5aa0: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
5ab0: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
5ac0: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
5ad0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
5ae0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5af0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
5b00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5b10: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
5b20: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
5b30: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
5b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
5b50: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
5b60: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
5b70: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
5b80: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5b90: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
5ba0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
5bb0: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
5bc0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
5bd0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5be0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
5bf0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
5c00: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
5c10: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
5c20: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
5c30: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
5c40: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
5c50: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5c60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
5c70: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
5c80: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
5c90: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5ca0: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
5cb0: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
5cc0: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
5cd0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5ce0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cf0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5d00: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5d10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d40: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d50: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d90: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5db0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5dc0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5df0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5e00: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5e10: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e20: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e40: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e50: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e80: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e90: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5ea0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5eb0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ec0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5ed0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ee0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ef0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5f00: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f20: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f30: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f40: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f50: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f70: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f80: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fa0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5fb0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fc0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fe0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5ff0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
6000: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
6010: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6030: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6040: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6050: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6070: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6080: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6090: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
60a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
60b0: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60c0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60d0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60e0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60f0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
6100: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6110: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6120: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6130: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6140: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6150: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6160: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6170: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6180: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6190: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
61a0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
61b0: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61e0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6200: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
6210: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6220: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6230: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6240: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6250: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6260: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6270: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6280: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6290: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
62a0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
62b0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62c0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6310: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6320: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6330: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6340: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6350: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6360: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6370: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6380: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6390: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
63a0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
63b0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63c0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63d0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63e0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63f0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
6400: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
6410: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6420: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6430: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6440: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6450: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6460: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6470: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6480: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6490: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
64a0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
64b0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64c0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64d0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64e0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64f0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
6510: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6520: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6530: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6540: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6550: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6560: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6570: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6580: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6590: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
65a0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
65b0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65c0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65d0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65e0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65f0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
6600: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
6610: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6620: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6630: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6640: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6650: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6660: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6670: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6680: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6690: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
66a0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
66b0: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66c0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66e0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66f0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
6700: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
6710: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6720: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6730: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6740: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6750: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6760: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6770: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6780: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6790: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
67a0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
67b0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67c0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67d0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67e0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67f0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
6800: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
6810: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6820: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6830: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6840: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6850: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6860: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6870: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6880: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6890: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
68a0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
68b0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68c0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68d0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68e0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68f0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
6900: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
6910: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6920: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6930: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6940: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6950: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6960: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6970: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6980: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6990: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
69a0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
69b0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69c0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69d0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69e0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69f0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
6a00: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
6a10: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a20: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a30: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a40: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a50: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a60: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a70: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a80: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a90: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6aa0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6ab0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6ac0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ad0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ae0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6af0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6b00: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6b10: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b20: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b30: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b40: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b50: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b70: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b80: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b90: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6ba0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6bb0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6bc0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
6bd0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
6be0: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
6bf0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
6c00: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
6c10: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
6c20: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
6c30: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
6c40: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
6c50: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
6c60: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
6c70: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
6c80: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
6c90: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
6ca0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
6cb0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
6cc0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
6cd0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
6ce0: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
6cf0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
6d00: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
6d10: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
6d20: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
6d30: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
6d40: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
6d50: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
6d60: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
6d70: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
6d80: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
6d90: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
6da0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
6db0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
6dc0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
6dd0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
6de0: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
6df0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
6e00: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
6e10: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
6e20: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
6e30: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
6e40: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
6e50: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
6e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6e70: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
6e80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6ea0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
6eb0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
6ec0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
6ed0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
6ee0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
6ef0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
6f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
6f10: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
6f20: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
6f30: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
6f40: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
6f50: 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  ->pWInfo;       
6f60: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
6f70: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
6f80: 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
6f90: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
6fa0: 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
6fb0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6fc0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
6fd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7000: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7010: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7020: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7030: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7040: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7050: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7060: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7080: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7090: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
70a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
70d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
70e0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
70f0: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
7100: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
7110: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
7120: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
7130: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
7140: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
7150: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7160: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7170: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7180: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7190: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
71a0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
71b0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
71c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
71d0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
71e0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
71f0: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
7200: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7210: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
7220: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
7230: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
7240: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
7250: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7260: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7270: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7280: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7290: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
72a0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
72b0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
72c0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
72d0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
72e0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
72f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
7300: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
7310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
7320: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7330: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
7340: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
7350: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
7360: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7370: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
7380: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
7390: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
73a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
73b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
73c0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
73d0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
73e0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
73f0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
7400: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
7410: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
7420: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
7430: 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  c, pWInfo);.  wh
7440: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
7450: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
7460: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
7470: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
7480: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7490: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
74a0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
74b0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
74c0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
74d0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
74e0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
74f0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
7500: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
7510: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
7520: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
7530: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
7540: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
7550: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
7560: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
7570: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
7580: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
7590: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
75a0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
75b0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
75c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
75d0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
75e0: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
75f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
7600: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
7610: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
7620: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7630: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
7640: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7650: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7660: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
7670: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
7680: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
7690: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
76a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
76b0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
76c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
76d0: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
76e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
76f0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
7700: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
7710: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7720: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
7730: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
7740: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7750: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
7760: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
7770: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
7780: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7790: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49  pAndWC, pWC->pWI
77a0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68  nfo);.        wh
77b0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
77c0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
77d0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
77e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
77f0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
7800: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e          pAndWC->
7810: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
7820: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7850: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7860: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
7870: 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d  or(j=0, pAndTerm
7880: 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41  =pAndWC->a; j<pA
7890: 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  ndWC->nTerm; j++
78a0: 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20  , pAndTerm++){. 
78b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
78c0: 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  t( pAndTerm->pEx
78d0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
78e0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
78f0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d  pAndTerm->pExpr-
7900: 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >op) ){.        
7910: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7920: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7930: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
7940: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7970: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
7980: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
7990: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
79a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
79b0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
79c0: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
79d0: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
79e0: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
79f0: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
7a00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
7a10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
7a20: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
7a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7a40: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
7a50: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26     b = getMask(&
7a60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
7a70: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
7a80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
7a90: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
7aa0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
7ab0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  L ){.        Whe
7ac0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
7ad0: 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65   &pOrWc->a[pOrTe
7ae0: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
7af0: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
7b00: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
7b10: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
7b20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7b30: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
7b40: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
7b50: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
7b60: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
7b70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
7b80: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
7b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ba0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7bc0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
7bd0: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
7be0: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
7bf0: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
7c00: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
7c10: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
7c20: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
7c30: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
7c40: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
7c50: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
7c60: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
7c70: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
7c80: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
7c90: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
7ca0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
7cb0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
7cc0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
7cd0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
7ce0: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
7cf0: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
7d00: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
7d10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
7d20: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
7d30: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
7d40: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
7d50: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
7d60: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
7d70: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
7d80: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
7d90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
7da0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
7db0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
7dc0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
7dd0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
7de0: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
7df0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
7e00: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
7e10: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
7e20: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
7e30: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
7e40: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
7e50: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
7e60: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
7e70: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
7e80: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
7e90: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
7ea0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
7eb0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
7ec0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
7ed0: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
7ee0: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
7ef0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
7f00: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
7f10: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
7f20: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
7f30: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
7f40: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
7f50: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
7f60: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
7f70: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
7f80: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
7f90: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
7fa0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
7fb0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
7fc0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
7fd0: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
7fe0: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
7ff0: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
8000: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
8010: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
8020: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
8030: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
8040: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
8060: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
8070: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
8080: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
8090: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
80a0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
80b0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
80c0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
80d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
80e0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
80f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
8100: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
8110: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
8120: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
8130: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
8140: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
8150: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
8160: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
8170: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
8180: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
8190: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
81a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
81b0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
81c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
81d0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
81e0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
81f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8200: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
8210: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
8220: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
8230: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
8240: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
8250: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
8260: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
8270: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
8280: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
8290: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
82a0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
82b0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
82c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
82d0: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
82e0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
82f0: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
8300: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
8310: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
8320: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
8330: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
8340: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
8350: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
8360: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
8370: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
8380: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
8390: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
83a0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
83b0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
83c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
83d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
83e0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
83f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8400: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
8410: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8420: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8430: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8450: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
8460: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
8470: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
8480: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
8490: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
84a0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
84b0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
84c0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
84d0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
84e0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
84f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8500: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8510: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
8520: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
8530: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
8540: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
8550: 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20  Cursor))==0 ){. 
8560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8570: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66   term must be of
8580: 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d   the form t1.a==
8590: 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73  t2.b where t2 is
85a0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
85b0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65    ** chngToIN se
85c0: 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e  t but t1 is not.
85d0: 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c    This term will
85e0: 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65   be either prece
85f0: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
8600: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
8610: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
8620: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
8630: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
8640: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
8650: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
8660: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
8670: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
8680: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8690: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
86d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
86e0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
86f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
8700: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
8710: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
8720: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
8740: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
8750: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8760: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
8770: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8780: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
8790: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
87a0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
87b0: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69       /* No candi
87c0: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d  date table+colum
87d0: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68  n was found.  Th
87e0: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
87f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  r.        ** on 
8800: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8810: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
8820: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
8830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8840: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e  IsPowerOfTwo(chn
8850: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  gToIN) );.      
8860: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f    assert( chngTo
8870: 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49  IN==getMask(&pWI
8880: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
8890: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
88a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
88b0: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
88c0: 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  ( j==1 );..     
88d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e   /* We have foun
88e0: 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61  d a candidate ta
88f0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
8900: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
8910: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
8920: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8930: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
8940: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
8950: 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  R clause */.    
8960: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8970: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20   1;.      for(; 
8980: 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67  i>=0 && okToChng
8990: 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  ToIN; i--, pOrTe
89a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
89b0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
89c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
89d0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
89e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
89f0: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
8a10: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
8a20: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
8a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8a40: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8a50: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
8a60: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
8a70: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
8a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a90: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
8aa0: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
8ab0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8ac0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
8ad0: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
8ae0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
8af0: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
8b00: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
8b10: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
8b20: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
8b30: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
8b40: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
8b50: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
8b60: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
8b70: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
8b80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8b90: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
8ba0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
8bb0: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
8bc0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8bd0: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
8be0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8bf0: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
8c00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8c10: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
8c20: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
8c30: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
8c50: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8c70: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
8c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8c90: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8cc0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
8cd0: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
8ce0: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
8cf0: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
8d00: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
8d10: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
8d20: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
8d30: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
8d40: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
8d50: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
8d60: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
8d70: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
8d80: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
8d90: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
8da0: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
8db0: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
8dc0: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
8dd0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
8de0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8df0: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
8e00: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
8e10: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
8e20: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
8e30: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
8e40: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8e50: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e60: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
8e70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
8e80: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8e90: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
8ea0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
8eb0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8ec0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8ed0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
8ee0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
8ef0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
8f00: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
8f10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8f20: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8f30: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8f40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8f60: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
8f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f80: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
8f90: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
8fa0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
8fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8fc0: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
8fd0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
8fe0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
8ff0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9000: 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50  ppend(pWInfo->pP
9010: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9020: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9030: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9040: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9050: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9060: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9070: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9080: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9090: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
90a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
90b0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
90c0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
90d0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
90e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
90f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9100: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9110: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9130: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9140: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9150: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9160: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9170: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9180: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9190: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
91a0: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
91b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
91c0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
91d0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
91e0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
91f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9200: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9210: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9220: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9230: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9240: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9250: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9260: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9290: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
92a0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
92b0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
92c0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
92d0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
92e0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
92f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9300: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9310: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9320: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9330: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
9340: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
9350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
9360: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
9370: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
9380: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
9390: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
93a0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
93b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
93c0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
93d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
93e0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
93f0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9400: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
9410: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
9420: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9430: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9440: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
9450: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
9460: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
9470: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
9480: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
9490: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
94a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
94b0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
94c0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
94d0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
94e0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
94f0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
9500: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
9510: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
9520: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
9530: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
9540: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
9560: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
9570: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
9580: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
9590: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
95a0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
95b0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
95c0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
95d0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
95e0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
95f0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9600: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
9610: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
9620: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
9630: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
9640: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
9650: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
9660: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
9670: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
9680: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
9690: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
96a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
96b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
96c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
96d0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
96e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
96f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
9700: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9720: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
9730: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9740: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9760: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
9770: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9780: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
9790: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
97a0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45  ->pWInfo; /* WHE
97b0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
97c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
97d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
97e0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
97f0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
9800: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9810: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
9820: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
9830: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
9840: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
9850: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
9860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9880: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9890: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
98a0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98c0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
98d0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
98e0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
98f0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9910: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
9920: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
9930: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
9940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9950: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
9960: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
9970: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
99a0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
99b0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
99c0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
99d0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
99e0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
99f0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
9a00: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
9a30: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
9a40: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
9a70: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
9a80: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
9a90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
9aa0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f  Info->pParse;  /
9ab0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9ac0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
9ad0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9b00: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
9b10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9b20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
9b30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9b40: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
9b50: 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
9b60: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72  MaskSet;.  pExpr
9b70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9b80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
9b90: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70  ->op!=TK_AS && p
9ba0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
9bb0: 4c 41 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71  LATE );.  prereq
9bc0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
9bd0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9be0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9bf0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
9c00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
9c10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9c20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
9c30: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
9c40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
9c50: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
9c60: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
9c70: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9c80: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
9c90: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9ca0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
9cb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9cc0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9cd0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
9ce0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cf0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
9d00: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
9d10: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
9d20: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
9d30: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9d40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9d50: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d60: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
9d70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9d80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9d90: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
9da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9db0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
9dc0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
9dd0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9de0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9df0: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
9e00: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9e10: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
9e20: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
9e30: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
9e40: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
9e50: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
9e60: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
9e70: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
9e80: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
9ea0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
9eb0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
9ec0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
9ed0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
9ee0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
9ef0: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
9f00: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
9f10: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
9f20: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
9f30: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
9f40: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
9f50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
9f60: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
9f70: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
9f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45  r->pLeft);.    E
9f90: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
9fa0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
9fb0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  late(pExpr->pRig
9fc0: 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d  ht);.    u16 opM
9fd0: 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ask = (pTerm->pr
9fe0: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
9ff0: 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f  eqLeft)==0 ? WO_
a000: 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a  ALL : WO_EQUIV;.
a010: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
a020: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a030: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
a040: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
a050: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
a060: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a070: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a080: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
a090: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
a0a0: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26  eratorMask(op) &
a0b0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20   opMask;.    }. 
a0c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
a0d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
a0e0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a0f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
a100: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
a110: 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65 45 78  p;.      u16 eEx
a120: 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20  traOp = 0;      
a130: 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20    /* Extra bits 
a140: 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61  for pNew->eOpera
a150: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tor */.      if(
a160: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
a170: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
a180: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
a190: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
a1a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a1b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a1c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a1d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
a1e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a1f0: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
a200: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a210: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
a220: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
a230: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
a240: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
a250: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
a260: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
a270: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
a280: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
a290: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
a2a0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
a2b0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
a2c0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
a2d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a2e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a2f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
a300: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
a310: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
a320: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
a330: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
a340: 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20  p==TK_EQ.       
a350: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
a360: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a370: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
a380: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
a390: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
a3a0: 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29  LITE_Transitive)
a3b0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
a3c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a3d0: 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55  erator |= WO_EQU
a3e0: 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45  IV;.          eE
a3f0: 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49  xtraOp = WO_EQUI
a400: 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  V;.        }.   
a410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a420: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
a430: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
a440: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
a450: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
a460: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
a470: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
a480: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
a490: 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29  ate(pDup->pLeft)
a4a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
a4b0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
a4c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
a4d0: 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  pNew->u.leftColu
a4e0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a4f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  umn;.      testc
a500: 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74  ase( (prereqLeft
a510: 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21   | extraRight) !
a520: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a  = prereqLeft );.
a530: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
a540: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
a550: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
a560: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
a570: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
a580: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
a590: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f  ->eOperator = (o
a5a0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
a5b0: 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70  ->op) + eExtraOp
a5c0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
a5d0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
a5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
a5f0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
a600: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
a610: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
a620: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
a630: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
a640: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
a650: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
a660: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
a670: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
a680: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
a690: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
a6a0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
a6b0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
a6c0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
a6d0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
a6e0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
a6f0: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
a700: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
a710: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
a720: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
a730: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
a740: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
a750: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
a760: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
a770: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
a780: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
a790: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
a7a0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
a7b0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
a7c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
a7d0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
a7e0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
a7f0: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
a800: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
a810: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
a820: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
a830: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
a840: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
a850: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
a860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
a870: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
a880: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
a890: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
a8a0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
a8b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
a8c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
a8d0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
a8e0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
a8f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
a900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
a910: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
a920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
a930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a940: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
a950: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a960: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
a970: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a980: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a9c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
aa10: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
aa20: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
aa30: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70  ings(pNewExpr, p
aa40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78  Expr);.      idx
aa50: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
aa60: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
aa70: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
aa80: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
aa90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aaa0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
aab0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
aac0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
aad0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
aae0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
aaf0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
ab00: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
ab10: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
ab20: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
ab30: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
ab40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ab50: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
ab60: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ab70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ab80: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ab90: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
aba0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
abb0: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
abc0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
abd0: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
abe0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
abf0: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
ac00: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
ac10: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
ac20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ac30: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
ac40: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
ac50: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
ac60: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
ac70: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
ac80: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
ac90: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
aca0: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
acb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
acc0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
acd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ace0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
acf0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
ad00: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
ad10: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
ad20: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
ad30: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
ad40: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
ad50: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
ad60: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
ad70: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
ad80: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
ad90: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
ada0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
adb0: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
adc0: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
add0: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
ade0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
adf0: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
ae00: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
ae10: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
ae20: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
ae30: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
ae40: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
ae50: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
ae60: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
ae70: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
ae80: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
ae90: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
aea0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
aeb0: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
aec0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
aed0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
aee0: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
aef0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
af00: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
af10: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
af20: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
af30: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
af40: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
af50: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
af60: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
af70: 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71    Token sCollSeq
af80: 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
af90: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
afa0: 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65  ence */..    pLe
afb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
afc0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
afd0: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
afe0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aff0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
b000: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b010: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38  iled ){.      u8
b020: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f   c, *pC;       /
b030: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72  * Last character
b040: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b050: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  t wildcard */.  
b060: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
b070: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73  Str2->u.zToken[s
b080: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b090: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d  Str2->u.zToken)-
b0a0: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
b0b0: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
b0c0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ase ){.        /
b0d0: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74  * The point is t
b0e0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
b0f0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  last character b
b100: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
b110: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63          ** wildc
b120: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20  ard.  But if we 
b130: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74  increment '@', t
b140: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74  hat will push it
b150: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
b160: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20    ** alphabetic 
b170: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65  range where case
b180: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c   conversions wil
b190: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20  l mess up the . 
b1a0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61         ** inequa
b1b0: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20  lity.  To avoid 
b1c0: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  this, make sure 
b1d0: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20  to also run the 
b1e0: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  full.        ** 
b1f0: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64  LIKE on all cand
b200: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
b210: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  s by clearing th
b220: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61  e isComplete fla
b230: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  g.        */.   
b240: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d       if( c=='A'-
b250: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  1 ) isComplete =
b260: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
b270: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
b280: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
b290: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
b2a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f  1;.    }.    sCo
b2b0: 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f  llSeqName.z = no
b2c0: 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20  Case ? "NOCASE" 
b2d0: 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
b2e0: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d  sCollSeqName.n =
b2f0: 20 36 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72   6;.    pNewExpr
b300: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  1 = sqlite3ExprD
b310: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
b320: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b330: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b340: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20  Parse, TK_GE, . 
b350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b360: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b370: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b380: 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr1,&sCollSeqN
b390: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b3a0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b3b0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b3c0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20  ings(pNewExpr1, 
b3d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b3e0: 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
b3f0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b400: 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52  wExpr1, TERM_VIR
b410: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b420: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b430: 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a  ( idxNew1==0 );.
b440: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b450: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b460: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
b470: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b480: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b490: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b4a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b4b0: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
b4c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b4d0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
b4e0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
b4f0: 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr2,&sCollSeqN
b500: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b510: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
b520: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
b530: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20  ings(pNewExpr2, 
b540: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
b550: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
b560: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b570: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
b580: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b590: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b5a0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
b5b0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b5c0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b5d0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
b5e0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b5f0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
b600: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
b610: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
b620: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b630: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
b640: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
b650: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
b660: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b670: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
b680: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b690: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
b6a0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
b6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b6c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
b6d0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
b6e0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
b6f0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b700: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
b710: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
b720: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b730: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
b740: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
b750: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
b760: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
b770: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
b780: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
b790: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
b7a0: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
b7b0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
b7c0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
b7d0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
b7e0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
b7f0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
b800: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
b810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
b820: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
b830: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
b840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b850: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
b860: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
b870: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
b880: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b890: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b8a0: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
b8b0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b8c0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
b8d0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
b8e0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b8f0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
b900: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
b910: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
b920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
b930: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
b940: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
b950: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
b960: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
b970: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
b980: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b990: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
b9a0: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
b9d0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
b9e0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b9f0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
ba00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ba10: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
ba20: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
ba30: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
ba40: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
ba50: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
ba60: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
ba70: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
ba80: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ba90: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
baa0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
bab0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
bac0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
bad0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
bae0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
baf0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
bb00: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
bb10: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
bb20: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb30: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
bb40: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
bb50: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
bb60: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
bb70: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
bb80: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
bb90: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
bba0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bbb0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
bbc0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
bbd0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
bbe0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
bbf0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
bc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bc10: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
bc20: 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71  AT4.  /* When sq
bc30: 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
bc40: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
bc50: 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74  ilable an operat
bc60: 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  or of the.  ** f
bc70: 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55  orm "x IS NOT NU
bc80: 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65  LL" can sometime
bc90: 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d  s be evaluated m
bca0: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a  ore efficiently.
bcb0: 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22    ** as "x>NULL"
bcc0: 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20   if x is not an 
bcd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bce0: 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75  KEY.  So constru
bcf0: 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  ct a.  ** virtua
bd00: 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66  l term of that f
bd10: 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  orm..  **.  ** N
bd20: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72  ote that the vir
bd30: 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62  tual term must b
bd40: 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45  e tagged with TE
bd50: 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a  RM_VNULL.  This.
bd60: 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20    ** TERM_VNULL 
bd70: 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73  tag will suppres
bd80: 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  s the not-null c
bd90: 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67 69  heck at the begi
bda0: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
bdb0: 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74  e loop.  Without
bdc0: 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20   the TERM_VNULL 
bdd0: 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75  flag, the not-nu
bde0: 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a  ll check at.  **
bdf0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
be00: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76  e loop will prev
be10: 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20  ent any results 
be20: 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72  from being retur
be30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
be40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
be50: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
be70: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
be80: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
be90: 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74  umn>=0.   && Opt
bea0: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
beb0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
bec0: 33 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  3).  ){.    Expr
bed0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
bee0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
bef0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
bf00: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bf10: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
bf20: 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78  erm;..    pNewEx
bf30: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
bf40: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c  r(pParse, TK_GT,
bf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bf70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bf80: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45         sqlite3PE
bfb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
bfc0: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ULL, 0, 0, 0), 0
bfd0: 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d  );..    idxNew =
bfe0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bff0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
c030: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56  M_DYNAMIC|TERM_V
c040: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69  NULL);.    if( i
c050: 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  dxNew ){.      p
c060: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
c070: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
c080: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c090: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  qRight = 0;.    
c0a0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c0b0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c0c0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c0d0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c0e0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c0f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c100: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c110: 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20   = WO_GT;.      
c120: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c130: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c140: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c150: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c160: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c180: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c190: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c1a0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c1b0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c1c0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c1d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c1e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
c1f0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  _OR_STAT4 */..  
c200: 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
c210: 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
c220: 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
c230: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
c240: 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
c250: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
c260: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
c270: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
c280: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
c290: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
c2a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c2b0: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
c2c0: 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
c2d0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
c2e0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
c2f0: 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
c300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
c310: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
c320: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
c330: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
c340: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
c350: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
c360: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
c370: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c380: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
c390: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
c3a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c3c0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
c3d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
c400: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
c410: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
c440: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
c450: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
c460: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
c490: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
c4a0: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
c4d0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
c4e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
c4f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
c500: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
c510: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
c520: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c530: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c540: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
c550: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
c560: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c570: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
c580: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
c590: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
c5a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
c5b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
c5c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
c5d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
c5e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
c5f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c600: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
c610: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
c620: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
c630: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
c640: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
c650: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
c660: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
c670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c680: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
c690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c6a0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
c6b0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
c6c0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
c6d0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
c6e0: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
c6f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
c700: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
c710: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
c720: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
c730: 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
c740: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
c750: 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
c760: 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
c770: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
c780: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
c790: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c7c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
c7e0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
c7f0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
c800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c810: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
c820: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
c830: 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
c840: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
c850: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
c860: 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
c870: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c880: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
c890: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
c8b0: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
c8c0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
c8d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
c8e0: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
c8f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c900: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
c910: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
c920: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
c930: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
c940: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
c950: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
c960: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
c970: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
c980: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
c990: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
c9a0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
c9b0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
c9c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
c9d0: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
c9e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
c9f0: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
ca00: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
ca10: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
ca20: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
ca30: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
ca40: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
ca50: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
ca60: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
ca70: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ca80: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
ca90: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
caa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
cab0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
cac0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
cae0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
caf0: 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
cb00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
cb10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
cb20: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
cb30: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
cb40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
cb50: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
cb60: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
cb70: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
cb80: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
cb90: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
cba0: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
cbb0: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
cbc0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
cbd0: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
cbe0: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
cbf0: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
cc00: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
cc10: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
cc20: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
cc30: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
cc40: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
cc50: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
cc60: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
cc70: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
cc80: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
cc90: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
cca0: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
ccb0: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
ccc0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
ccd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
cce0: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
ccf0: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
cd00: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
cd10: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
cd20: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
cd30: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
cd40: 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
cd50: 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
cd60: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
cd70: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
cd80: 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
cd90: 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
cda0: 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
cdb0: 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
cdc0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
cdd0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cde0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cdf0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ce00: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
ce10: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
ce20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ce30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
ce40: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
ce50: 0a 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20  .      i16 iCol 
ce60: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
ce70: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
ce80: 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
ce90: 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
cea0: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
ceb0: 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
cec0: 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
ced0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
cee0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
cef0: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
cf00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
cf10: 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
cf20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
cf30: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
cf40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cf50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cf60: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
cf70: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
cf80: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
cf90: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
cfa0: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
cfb0: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
cfc0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
cfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
cfe0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
cff0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d000: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
d010: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
d020: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
d030: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
d040: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
d050: 20 20 4c 6f 67 45 73 74 20 78 20 3d 20 73 71 6c    LogEst x = sql
d060: 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 3b 0a 20  ite3LogEst(N);. 
d070: 20 72 65 74 75 72 6e 20 78 3e 33 33 20 3f 20 78   return x>33 ? x
d080: 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a   - 33 : 0;.}../*
d090: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
d0a0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
d0b0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
d0c0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d0d0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
d0e0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
d0f0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
d100: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
d110: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
d120: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
d130: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
d140: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
d150: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
d160: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
d170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d180: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
d190: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
d1a0: 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69  E_ENABLED).stati
d1b0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
d1c0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
d1d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d1e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d1f0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d200: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d210: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d220: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d230: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d240: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
d250: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
d260: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
d270: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
d280: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d290: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d2a0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d2b0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d2c0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
d2d0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2e0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
d2f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d300: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
d310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
d320: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
d330: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
d340: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d350: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
d360: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
d370: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d380: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
d390: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d3a0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
d3b0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
d3c0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
d3d0: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
d3e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
d3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
d400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
d410: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
d420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
d430: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
d440: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d450: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
d460: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
d470: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
d480: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d490: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d4a0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
d4b0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
d4c0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
d4d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d4e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d4f0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
d500: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
d510: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d520: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
d530: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
d540: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d550: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
d560: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
d570: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
d580: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d590: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5a0: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
d5b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
d5c0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d5d0: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
d5e0: 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d  Rows=%lld\n", p-
d5f0: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
d600: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
d610: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
d620: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
d630: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
d640: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
d650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d660: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d670: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
d680: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
d690: 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
d6a0: 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
d6b0: 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
d6c0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
d6d0: 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
d6e0: 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
d6f0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
d700: 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
d710: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
d720: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
d730: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d740: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
d750: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
d760: 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
d770: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
d780: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
d790: 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
d7a0: 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
d7b0: 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
d7c0: 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
d7d0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
d7e0: 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
d7f0: 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
d800: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
d810: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
d820: 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
d830: 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
d840: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
d850: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d860: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
d870: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
d880: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
d890: 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
d8a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
d8b0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c  m->u.leftColumn<
d8c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8d0: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
d8e0: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
d8f0: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
d900: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
d910: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
d920: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
d930: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
d940: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
d950: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
d960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d970: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
d980: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d990: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
d9a0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
d9b0: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
d9c0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
d9d0: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
d9e0: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
d9f0: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
da00: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
da10: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
da20: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
da30: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
da40: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
da50: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
da60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
da70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da80: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
da90: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
daa0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
dab0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
dac0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
dad0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
dae0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
daf0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
db00: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
db10: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
db20: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
db30: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
db40: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
db50: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
db60: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
db70: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
db80: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
db90: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
dba0: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
dbd0: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
dbe0: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
dbf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dc00: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
dc10: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
dc20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
dc30: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
dc40: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
dc50: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
dc60: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
dc70: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
dc80: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
dc90: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
dca0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
dcb0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
dce0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
dcf0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
dd00: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
dd20: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
dd30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
dd40: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
dd50: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd70: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
dd80: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
dd90: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
dda0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
ddb0: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
ddc0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
ddd0: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
dde0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
ddf0: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
de00: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
de10: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
de20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de30: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
de40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
de60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
de70: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de90: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
dea0: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
deb0: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
dec0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
ded0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
dee0: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
def0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
df00: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
df10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
df20: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
df30: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
df40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
df50: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
df60: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
df70: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
df80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
df90: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
dfa0: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
dfb0: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
dfc0: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
dfd0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
dfe0: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
dff0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
e000: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
e010: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
e020: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
e030: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
e040: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e050: 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
e060: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
e070: 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
e080: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
e090: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
e0a0: 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
e0b0: 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
e0c0: 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
e0d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
e0e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
e0f0: 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
e100: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
e110: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
e120: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e130: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
e140: 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
e150: 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
e160: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
e170: 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
e180: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e190: 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
e1a0: 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
e1b0: 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
e1c0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
e1d0: 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
e1e0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
e1f0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
e200: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e210: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e220: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
e230: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
e240: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
e250: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
e260: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e270: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
e280: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
e290: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
e2a0: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
e2b0: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
e2c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
e2d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e2e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e2f0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
e300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
e310: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
e330: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
e340: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
e350: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
e360: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
e370: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
e380: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
e390: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
e3a0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e3b0: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
e3c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
e3d0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
e3e0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
e3f0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
e400: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
e410: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
e420: 43 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b  Col+1) ) return;
e430: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e440: 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b  aLTerm[nKeyCol++
e450: 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
e460: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
e470: 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
e480: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
e490: 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20   nKeyCol>0 );.  
e4a0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
e4b0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  Eq = pLoop->nLTe
e4c0: 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20  rm = nKeyCol;.  
e4d0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
e4e0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
e4f0: 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
e500: 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
e510: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
e520: 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41         | WHERE_A
e530: 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a  UTO_INDEX;..  /*
e540: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e550: 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
e560: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
e570: 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
e580: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
e590: 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
e5a0: 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
e5b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
e5c0: 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
e5d0: 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
e5e0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
e5f0: 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
e600: 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
e610: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
e620: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
e630: 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
e640: 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
e650: 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
e660: 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
e670: 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
e680: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
e690: 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
e6a0: 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
e6b0: 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
e6c0: 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
e6d0: 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
e6e0: 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
e6f0: 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
e700: 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
e710: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
e720: 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42  ~idxCols | MASKB
e730: 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78  IT(BMS-1));.  mx
e740: 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65  BitCol = (pTable
e750: 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29  ->nCol >= BMS-1)
e760: 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c   ? BMS-1 : pTabl
e770: 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63  e->nCol;.  testc
e780: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
e790: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
e7a0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e7b0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
e7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
e7d0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
e7e0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
e7f0: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
e800: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
e810: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
e820: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
e830: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
e840: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
e850: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20  - BMS + 1;.  }. 
e860: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
e870: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
e880: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
e890: 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  NLY;..  /* Const
e8a0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
e8b0: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
e8c0: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
e8d0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
e8e0: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
e8f0: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
e900: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
e910: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
e920: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e930: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
e940: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
e950: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
e960: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
e970: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
e980: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
e990: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
e9a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
e9b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
e9c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
e9d0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
e9e0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
e9f0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
ea00: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
ea10: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
ea20: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
ea30: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
ea40: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
ea50: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
ea60: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
ea70: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
ea80: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
ea90: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
eaa0: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
eab0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
eac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
ead0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
eae0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
eaf0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
eb00: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
eb10: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
eb20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
eb30: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
eb40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
eb50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
eb60: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
eb70: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
eb80: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
eb90: 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
eba0: 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
ebb0: 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
ebc0: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ebe0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
ebf0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
ec00: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
ec10: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
ec20: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
ec30: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
ec40: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
ec50: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
ec60: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
ec70: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
ec80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
ec90: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
eca0: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
ecb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ecc0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
ecd0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ece0: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
ecf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ed00: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
ed10: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
ed20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
ed30: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
ed40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
ed50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ed60: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed70: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed80: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
eda0: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
edb0: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
edc0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20  olumn[n] = -1;. 
edd0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ede0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20   = "BINARY";..  
edf0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
ee00: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
ee10: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
ee20: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
ee30: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
ee40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
ee50: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
ee60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ee70: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
ee80: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
ee90: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
eea0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
eeb0: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
eec0: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
eed0: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
eee0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
eef0: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
ef00: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ef10: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
ef20: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
ef30: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ef40: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
ef50: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
ef60: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
ef70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef80: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ef90: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
efa0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
efb0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
efc0: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 29  regRecord, 0, 0)
efd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
efe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
eff0: 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
f000: 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
f010: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
f020: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
f030: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
f040: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
f050: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f060: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
f070: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
f080: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
f090: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
f0a0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f0b0: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
f0c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f0d0: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
f0e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f0f0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
f100: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
f110: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
f120: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
f130: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
f140: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f150: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
f160: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f170: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f180: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1a0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f1b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f1c0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f1d0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f1e0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f1f0: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f200: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f210: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f220: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f230: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f240: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f250: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f260: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f280: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f290: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f2a0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f2b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f2c0: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f2d0: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f2e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f2f0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f300: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f310: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f320: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f330: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f340: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f350: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f360: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f370: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f380: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f390: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f3a0: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f3b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f3c0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f3d0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f3e0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f3f0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f410: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f420: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f430: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f440: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f450: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f460: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f470: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f480: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f490: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f4a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f4b0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f4c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f4d0: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f4e0: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f4f0: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f500: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f510: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f520: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f530: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f540: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f550: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f560: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
f570: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
f580: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
f590: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
f5a0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
f5b0: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
f5c0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
f5d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
f5e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
f5f0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
f600: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
f610: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
f620: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
f630: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
f640: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
f650: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
f660: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f670: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
f680: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
f690: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
f6a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
f6b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
f6c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
f6d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
f6e0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
f6f0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
f700: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f710: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
f720: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
f730: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
f740: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
f750: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
f760: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
f770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f780: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
f790: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f7a0: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
f7b0: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
f7c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
f7d0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
f7e0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
f810: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
f820: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
f830: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
f860: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
f870: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
f880: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
f890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8a0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
f8b0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
f8c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f8d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f8e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
f8f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f900: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
f910: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
f920: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
f930: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
f940: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
f950: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
f960: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
f970: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
f980: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
f990: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
f9a0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
f9b0: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
f9c0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
f9d0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f9e0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
f9f0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
fa00: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
fa10: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fa20: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
fa30: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
fa40: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
fa50: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fa60: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
fa70: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
fa80: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
fa90: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
faa0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
fab0: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
fac0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
fad0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
fae0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
faf0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fb00: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
fb10: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
fb20: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
fb30: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fb40: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
fb50: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
fb60: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
fb70: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fb80: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
fb90: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
fba0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
fbb0: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
fc00: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
fc10: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
fc20: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
fc30: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
fc40: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
fc50: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
fc60: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
fc70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fc80: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
fc90: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
fca0: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
fcb0: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
fcc0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fcd0: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
fce0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fcf0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd00: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
fd10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
fd20: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
fd30: 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
fd40: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fd50: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
fd60: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
fd70: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
fd80: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
fd90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
fda0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
fdb0: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
fdc0: 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
fdd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fde0: 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
fdf0: 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
fe00: 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
fe10: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
fe20: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
fe30: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
fe40: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
fe50: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
fe60: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
fe70: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
fe80: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
fe90: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
fea0: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
feb0: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
fec0: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
fed0: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
fee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
fef0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
ff00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
ff10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
ff20: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
ff30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
ff40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
ff50: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
ff60: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
ff70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ff80: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
ff90: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
ffa0: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
ffb0: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
ffc0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ffd0: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
ffe0: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
fff0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10000 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
10010 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
10020 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
10030 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
10040 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
10050 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
10060 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
10070 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
10080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10090 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
100a0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
100b0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
100c0 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
100d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
100e0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
100f0 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
10100 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10110 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10120 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
10130 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
10140 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
10150 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
10160 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
10170 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
10180 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
10190 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
101a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
101b0 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
101c0 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
101d0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
101e0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
101f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10200 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
10210 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
10220 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
10230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10240 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10250 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
10260 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
10270 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
10280 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
10290 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
102a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
102b0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
102c0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
102d0 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
102e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
102f0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
10300 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
10310 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
10320 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
10330 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
10340 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
10350 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
10360 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
10370 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
10380 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
10390 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
103a0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
103b0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
103c0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
103d0 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
103e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
103f0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
10400 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
10410 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10420 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
10430 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
10440 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
10450 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
10460 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
10470 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
10480 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
10490 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
104a0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
104b0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
104c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
104d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
104e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
104f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
10500 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10510 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
10520 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
10530 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
10540 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10550 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
10560 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
10570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10590 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
105a0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
105b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
105c0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
105d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
105e0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
105f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
10600 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
10610 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
10620 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
10630 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
10640 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
10650 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
10660 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10670 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
10680 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
10690 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
106a0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
106b0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
106c0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
106d0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
106e0 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
106f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10700 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10710 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66  LTABLE) */...#if
10720 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10730 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
10740 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
10750 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
10760 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
10770 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
10780 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
10790 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
107a0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
107b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
107c0 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
107d0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
107e0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
107f0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
10800 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
10810 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
10820 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
10830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
10850 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b  atic void whereK
10860 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
10870 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10880 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10890 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
108a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
108d0 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
108e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
108f0 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
10900 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
10910 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
10920 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
10950 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
10960 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
10970 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
10980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
10990 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
109a0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
109b0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
109c0 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
109d0 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
10a00 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
10a10 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
10a20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a40 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
10a50 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
10a60 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78  /.  int i = pIdx
10a70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  ->nSample;      
10a80 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10a90 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
10aa0 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
10ab0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
10ae0 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
10af0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
10b00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10b10 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
10b20 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23   operation */..#
10b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
10b40 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
10b50 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29  AMETER( pParse )
10b60 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
10b70 74 28 20 70 52 65 63 21 3d 30 20 7c 7c 20 70 50  t( pRec!=0 || pP
10b80 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
10b90 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
10ba0 70 52 65 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pRec==0 ) return
10bb0 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d  ;.  iCol = pRec-
10bc0 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61  >nField - 1;.  a
10bd0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
10be0 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
10bf0 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
10c00 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  >0 && iCol<pIdx-
10c10 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20  >nSampleCol );. 
10c20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d   do{.    iTest =
10c30 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20   (iMin+i)/2;.   
10c40 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
10c50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10c60 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e  aSample[iTest].n
10c70 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  , aSample[iTest]
10c80 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69  .p, pRec);.    i
10c90 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
10ca0 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
10cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10cc0 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a 20 20     i = iTest;.  
10cd0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
10ce0 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a  s && iMin<i );..
10cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10d00 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
10d10 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
10d20 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
10d30 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
10d40 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
10d50 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
10d60 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
10d70 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
10d80 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
10d90 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
10da0 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
10db0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d  .  */.  if( res=
10dc0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10dd0 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65  (res==0) is true
10de0 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20 24 69  , then sample $i
10df0 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
10e00 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20 61 73  o pRec */.    as
10e10 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
10e20 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  ample );.    ass
10e30 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
10e40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
10e50 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
10e60 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
10e70 63 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  c).         || p
10e80 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
10e90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c  cFailed );.  }el
10ea0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
10eb0 77 69 73 65 2c 20 70 52 65 63 20 6d 75 73 74 20  wise, pRec must 
10ec0 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
10ed0 73 61 6d 70 6c 65 20 24 69 20 61 6e 64 20 6c 61  sample $i and la
10ee0 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  rger than.    **
10ef0 20 73 61 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20   sample ($i-1). 
10f00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10f10 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
10f20 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71   .         || sq
10f30 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10f40 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
10f50 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
10f60 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20  p, pRec)>0.     
10f70 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
10f80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10f90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
10fa0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
10fb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10fc0 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
10fd0 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
10fe0 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
10ff0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
11000 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
11010 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  ailed );.  }.#en
11020 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
11030 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20  ITE_DEBUG */..  
11040 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
11050 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20  , aSample[i] is 
11060 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
11070 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
11080 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71   than.  ** or eq
11090 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72  ual to pVal.  Or
110a0 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61   if i==pIdx->nSa
110b0 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  mple, then all s
110c0 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a  amples are less.
110d0 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20    ** than pVal. 
110e0 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d   If aSample[i]==
110f0 70 56 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d  pVal, then res==
11100 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  0..  */.  if( re
11110 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61  s==0 ){.    aSta
11120 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
11130 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11140 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
11150 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
11160 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
11170 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c   tRowcnt iLower,
11180 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20   iUpper, iGap;. 
11190 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
111a0 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
111b0 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
111c0 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b  aSample[0].anLt[
111d0 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  iCol];.    }else
111e0 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
111f0 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
11200 65 20 3f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  e ? pIdx->aiRowE
11210 73 74 5b 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b  st[0] : aSample[
11220 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
11230 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
11240 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b  ample[i-1].anEq[
11250 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  iCol] + aSample[
11260 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  i-1].anLt[iCol];
11270 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
11280 5b 31 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 4b 65  [1] = (pIdx->nKe
11290 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49 64 78  yCol>iCol ? pIdx
112a0 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a  ->aAvgEq[iCol] :
112b0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f   1);.    if( iLo
112c0 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
112d0 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
112e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
112f0 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
11300 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
11310 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
11320 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
11330 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
11340 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
11350 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
11360 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
11370 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
11380 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
11390 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
113a0 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
113b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
113c0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
113d0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
113e0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
113f0 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
11400 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
11410 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
11420 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
11430 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
11440 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
11450 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
11460 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
11470 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11480 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
11490 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
114a0 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
114b0 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
114c0 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
114d0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
114e0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
114f0 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
11500 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
11510 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
11520 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
11530 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
11560 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11580 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
115b0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
115c0 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
115d0 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
115e0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
115f0 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
11600 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
11610 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
11620 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
11630 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
11640 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
11650 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
11660 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
11670 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c  the index.** col
11680 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
11690 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
116a0 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
116b0 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
116c0 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79  r of.** equality
116d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74   constraints opt
116e0 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
116f0 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
11700 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  n. For example,.
11710 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  ** assuming inde
11720 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20  x p is on t1(a, 
11730 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
11740 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
11750 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
11760 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
11770 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
11780 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
11790 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73   is set to 1 (as
117a0 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
117b0 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c  icted column, b,
117c0 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   is the second .
117d0 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
117e0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
117f0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
11800 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
11810 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
11820 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
11830 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
11840 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30   nEq is set to 0
11850 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
11860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11870 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20  lled, *pnOut is 
11880 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  set to the sqlit
11890 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68  e3LogEst() of th
118a0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
118b0 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ows that the ind
118c0 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ex scan is expec
118d0 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74  ted to visit wit
118e0 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  hout .** conside
118f0 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63  ring the range c
11900 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e  onstraints. If n
11910 45 71 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  Eq is 0, this is
11920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
11930 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
11940 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
11950 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
11960 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
11970 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
11980 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
11990 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69  he range contrai
119a0 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
119b0 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
119c0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
119d0 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
119e0 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
119f0 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
11a00 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61  t be.** used, ea
11a10 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  ch range inequal
11a20 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
11a30 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
11a40 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a  a factor of 4. .
11a50 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72 20  ** Hence a pair 
11a60 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  of constraints (
11a70 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
11a80 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65  uces the expecte
11a90 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72  d number of.** r
11aa0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
11ab0 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a   factor of 16..*
11ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
11ad0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
11ae0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11af0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11b00 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
11b10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11b20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
11b30 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57  r *pBuilder,.  W
11b40 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
11b50 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
11b60 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
11b70 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
11b80 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
11b90 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
11ba0 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
11bb0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
11bc0 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
11bd0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
11be0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
11bf0 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20  p     /* Modify 
11c00 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61  the .nOut and ma
11c10 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73  ybe .rRun fields
11c20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11c30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11c40 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d  nt nOut = pLoop-
11c50 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20  >nOut;.  LogEst 
11c60 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
11c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
11c80 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64  3_OR_STAT4.  Ind
11c90 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
11ca0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
11cb0 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
11cc0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
11cd0 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
11ce0 3e 30 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42  >0.   && nEq==pB
11cf0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
11d00 64 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  d.   && nEq<p->n
11d10 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20  SampleCol.   && 
11d20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
11d30 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
11d40 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20  SQLITE_Stat3) . 
11d50 20 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64   ){.    Unpacked
11d60 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
11d70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
11d80 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
11d90 0a 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20  .    u8 aff;..  
11da0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c    /* Variable iL
11db0 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74  ower will be set
11dc0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
11dd0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
11de0 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a  f rows in .    *
11df0 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
11e00 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
11e10 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
11e20 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
11e30 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f  y. The.    ** lo
11e40 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
11e50 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
11e60 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
11e70 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
11e80 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69      ** key-prefi
11e90 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  x formed by the 
11ea0 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68  nEq values match
11eb0 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e  ed against the n
11ec0 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20  Eq left-most.   
11ed0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74   ** columns of t
11ee0 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c  he index, and $L
11ef0 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
11f00 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a   pLower..    **.
11f10 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
11f20 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
11f30 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
11f40 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
11f50 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a  because it.    *
11f60 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  * is not a simpl
11f70 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69  e variable or li
11f80 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68  teral value), th
11f90 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
11fa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
11fb0 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20  e is $P. Due to 
11fc0 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77  a quirk in the w
11fd0 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  ay whereKeyStats
11fe0 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20  () works, even. 
11ff0 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
12000 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
12010 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
12020 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
12030 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24  ) and .    ** ($
12040 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
12050 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
12060 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
12070 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  used..    **.   
12080 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
12090 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
120a0 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
120b0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
120c0 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
120d0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
120e0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
120f0 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
12100 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
12110 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69  und.    ** is ei
12120 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
12130 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
12140 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
12150 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
12160 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70  s.    ** of iUpp
12170 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
12180 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
12190 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
121a0 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f  ler used..    */
121b0 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  .    tRowcnt iLo
121c0 77 65 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  wer;.    tRowcnt
121d0 20 69 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66   iUpper;..    if
121e0 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f  ( nEq==p->nKeyCo
121f0 6c 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  l ){.      aff =
12200 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
12210 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  GER;.    }else{.
12220 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70        aff = p->p
12230 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
12240 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66  iColumn[nEq]].af
12250 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20  finity;.    }.  
12260 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69    /* Determine i
12270 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72  Lower and iUpper
12280 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79   using ($P) only
12290 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71  . */.    if( nEq
122a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  ==0 ){.      iLo
122b0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  wer = 0;.      i
122c0 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77  Upper = p->aiRow
122d0 45 73 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73  Est[0];.    }els
122e0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  e{.      /* Note
122f0 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
12300 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
12310 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
12320 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
12330 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20   .      ** have 
12340 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
12350 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
12360 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
12370 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
12380 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
12390 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
123a0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
123b0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
123c0 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
123d0 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20  [0] + a[1];.    
123e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  }..    /* If pos
123f0 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
12400 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
12410 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
12420 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  $L). */.    if( 
12430 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
12440 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
12450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12460 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
12470 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
12480 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  Expr */.      Ex
12490 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
124a0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
124b0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
124c0 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
124d0 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
124e0 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
124f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
12500 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
12510 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
12520 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
12530 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
12540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12550 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  K && bOk ){.    
12560 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
12570 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  ;.        whereK
12580 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
12590 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
125a0 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
125b0 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e  [0] + ((pLower->
125c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
125d0 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  T) ? a[1] : 0);.
125e0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
125f0 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
12600 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
12610 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d   nOut--;.      }
12620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12630 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
12640 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65  ove on the iUppe
12650 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
12660 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20   ($P:$U). */.   
12670 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
12680 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
126b0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
126c0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
126d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
126e0 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
126f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
12700 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
12710 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
12720 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
12730 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12740 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
12750 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
12760 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
12770 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
12780 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12790 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
127a0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
127b0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
127c0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
127d0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c  rse, p, pRec, 1,
127e0 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
127f0 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70  w = a[0] + ((pUp
12800 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
12810 20 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a   WO_LE) ? a[1] :
12820 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12830 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69   iNew<iUpper ) i
12840 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Upper = iNew;.  
12850 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
12860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12870 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
12880 3d 20 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20  = pRec;.    if( 
12890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
128a0 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
128b0 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  r>iLower ){.    
128c0 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
128d0 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
128e0 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
128f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12900 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20  nNew = 10;      
12910 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
12920 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
12930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12940 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
12950 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
12960 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
12970 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
12980 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
12990 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
129a0 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
129b0 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
129c0 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
129f0 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
12a00 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  r, nOut));.     
12a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12a20 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  K;.    }.  }.#el
12a30 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
12a40 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
12a50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12a60 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e  R(pBuilder);.#en
12a70 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
12a80 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
12a90 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  ;.  /* TUNING:  
12aa0 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20  Each inequality 
12ab0 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
12ac0 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
12ad0 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a  ace 4-fold..  **
12ae0 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   A BETWEEN opera
12af0 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  tor, therefore, 
12b00 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
12b10 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64  ch space 16-fold
12b20 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75   */.  nNew = nOu
12b30 74 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  t;.  if( pLower 
12b40 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
12b50 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
12b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77  )==0 ){.    nNew
12b70 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
12b80 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
12b90 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
12ba0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20     nOut--;.  }. 
12bb0 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
12bc0 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20     nNew -= 20;  
12bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
12be0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
12bf0 34 29 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d  4) );.    nOut--
12c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77  ;.  }.  if( nNew
12c10 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b  <10 ) nNew = 10;
12c20 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74  .  if( nNew<nOut
12c30 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a   ) nOut = nNew;.
12c40 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
12c50 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
12c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
12c70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12c80 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
12c90 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
12ca0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12cb0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
12cc0 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
12cd0 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
12ce0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
12cf0 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
12d00 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
12d10 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
12d20 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
12d30 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
12d40 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
12d50 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
12d60 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
12d70 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
12d80 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
12d90 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
12da0 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
12db0 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
12dc0 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
12dd0 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
12de0 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
12df0 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
12e00 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
12e10 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
12e20 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
12e30 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
12e40 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
12e50 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
12e60 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
12e70 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
12e80 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
12e90 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
12ea0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
12eb0 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
12ec0 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
12ed0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
12ee0 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
12ef0 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
12f00 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
12f10 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
12f20 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
12f30 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
12f40 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
12f50 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
12f60 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
12f70 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
12f80 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
12f90 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
12fa0 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
12fb0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
12fc0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
12fd0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
12fe0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
12ff0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
13000 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  ,.  Expr *pExpr,
13010 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
13020 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45  ession for VALUE
13030 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20   in the x=VALUE 
13040 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
13050 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
13060 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
13070 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
13080 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
13090 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
130a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
130b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
130c0 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c   int nEq = pBuil
130d0 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
130e0 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b  ee.nEq;.  Unpack
130f0 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
13100 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
13110 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13130 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
13140 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13160 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
13170 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
13180 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
13190 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
131a0 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
131b0 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  bOk;..  assert( 
131c0 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  nEq>=1 );.  asse
131d0 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65  rt( nEq<=(p->nKe
131e0 79 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73  yCol+1) );.  ass
131f0 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
13200 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13210 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
13220 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
13230 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
13240 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
13250 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
13260 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
13270 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
13280 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
13290 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
132a0 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
132b0 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
132c0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
132d0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
132e0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
132f0 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
13300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
13310 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
13320 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
13330 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
13340 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
13350 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
13360 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
13370 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
13380 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
13390 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e  /.  if( nEq>p->n
133a0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70  KeyCol ){.    *p
133b0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  nRow = 1;.    re
133c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133d0 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e    }..  aff = p->
133e0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
133f0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d  aiColumn[nEq-1]]
13400 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20  .affinity;.  rc 
13410 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
13420 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
13430 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
13440 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c  xpr, aff, nEq-1,
13450 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64   &bOk);.  pBuild
13460 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
13470 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13480 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13490 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29  ;.  if( bOk==0 )
134a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
134b0 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c  OTFOUND;.  pBuil
134c0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
134d0 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65   nEq;..  whereKe
134e0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
134f0 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
13500 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
13510 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  ,("equality scan
13520 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c   regions: %d\n",
13530 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20   (int)a[1]));.  
13540 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20  *pnRow = a[1];. 
13550 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
13560 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13570 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13580 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64  R_STAT4 */..#ifd
13590 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
135a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
135b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
135c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
135d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
135e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
135f0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
13600 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
13610 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
13620 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13630 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
13640 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
13650 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
13660 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
13670 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
13680 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
13690 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
136a0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
136b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
136c0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
136d0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
136e0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
136f0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
13700 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
13710 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13720 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
13730 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
13740 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
13750 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
13760 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
13770 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
13780 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
13790 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
137a0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
137b0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
137c0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
137d0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
137e0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
137f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
13800 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
13810 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
13820 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13830 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
13840 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
13850 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
13860 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
13870 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73  ilder,.  ExprLis
13880 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
13890 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
138a0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
138b0 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
138c0 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  .)" */.  tRowcnt
138d0 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
138e0 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
138f0 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
13900 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
13910 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
13920 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
13930 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52  pIndex;.  int nR
13940 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
13950 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
13960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13970 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66  _OK;     /* Subf
13980 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
13990 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
139a0 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20   nEst;          
139b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
139c0 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
139d0 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  term */.  tRowcn
139e0 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20  t nRowEst = 0;  
139f0 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
13a00 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
13a10 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
13a20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
13a30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13a40 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
13a50 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13a60 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   );.  for(i=0; r
13a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13a80 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13a90 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d  i++){.    nEst =
13aa0 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b   p->aiRowEst[0];
13ab0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45  .    rc = whereE
13ac0 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
13ad0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c  se, pBuilder, pL
13ae0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
13af0 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
13b00 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
13b10 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
13b20 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
13b30 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  d;.  }..  if( rc
13b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13b50 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
13b60 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20   p->aiRowEst[0] 
13b70 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61  ) nRowEst = p->a
13b80 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
13b90 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
13ba0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
13bb0 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
13bc0 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c  stimate: est=%g\
13bd0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
13be0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
13bf0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13c00 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
13c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
13c20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13c30 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
13c40 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  TAT4 */../*.** D
13c50 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
13c60 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13c70 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
13c80 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
13c90 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
13ca0 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
13cb0 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
13cc0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
13cd0 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
13ce0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
13cf0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
13d00 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
13d10 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
13d20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
13d30 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
13d40 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
13d50 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
13d60 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
13d70 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
13d80 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
13d90 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
13da0 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
13db0 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
13dc0 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
13dd0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
13de0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
13df0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
13e00 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
13e10 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
13e20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
13e30 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
13e40 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
13e50 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
13e60 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
13e70 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
13e80 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
13e90 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
13ea0 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
13eb0 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
13ec0 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
13ed0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
13ee0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
13ef0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
13f00 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
13f10 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
13f20 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
13f30 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
13f40 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
13f50 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
13f60 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
13f70 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
13f80 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
13f90 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
13fa0 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
13fb0 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
13fc0 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
13fd0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
13fe0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
13ff0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
14000 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
14010 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
14020 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
14030 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
14040 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
14050 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
14060 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
14070 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
14080 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
14090 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
140a0 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
140b0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
140c0 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
140d0 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
140e0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
140f0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
14100 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
14110 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
14120 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
14130 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
14140 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
14150 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
14160 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
14170 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
14180 6e 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d  notReady & pTerm
14190 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a  ->prereqAll)==0.
141a0 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
141b0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
141c0 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
141d0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
141e0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
141f0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
14200 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
14210 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
14220 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
14230 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
14240 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
14250 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
14260 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
14270 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14280 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
14290 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
142a0 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
142b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
142c0 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
142d0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
142e0 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
142f0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
14300 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
14310 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
14320 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
14330 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
14340 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
14350 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
14360 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
14370 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
14380 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
14390 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
143a0 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
143b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
143c0 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
143d0 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
143e0 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
143f0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
14400 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
14410 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
14420 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
14430 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
14440 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
14450 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
14460 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
14470 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
14480 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14490 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
144a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
144b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
144c0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
144d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
144e0 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
144f0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
14500 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
14510 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
14520 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
14530 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
14540 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
14550 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
14560 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
14570 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
14580 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
14590 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
145a0 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
145b0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
145c0 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
145d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
145e0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
145f0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
14600 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
14610 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
14620 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
14630 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
14640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
14660 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
14670 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14680 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
14690 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
146a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
146b0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
146c0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
146d0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
146e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
146f0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
14700 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
14710 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
14720 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
14730 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
14740 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
14750 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
14760 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
14770 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
14780 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
14790 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
147a0 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
147b0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
147c0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
147d0 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
147e0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
147f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
14800 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
14810 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
14820 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
14830 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
14840 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
14850 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
14860 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
14870 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
14880 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
14890 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
148a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
148b0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
148c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
148d0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
148e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
148f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
14900 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
14910 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
14920 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
14930 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
14940 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
14950 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
14960 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
14970 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
14980 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
14990 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
149a0 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
149b0 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
149c0 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
149d0 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
149e0 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
149f0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
14a00 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
14a10 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
14a20 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
14a30 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
14a40 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
14a50 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
14a60 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
14a70 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
14a80 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
14a90 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
14aa0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
14ab0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
14ac0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
14ad0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
14ae0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
14af0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
14b00 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
14b10 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
14b20 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
14b30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
14b40 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
14b50 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
14b60 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
14b70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b80 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
14b90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14ba0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
14bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
14bc0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
14bd0 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
14be0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
14bf0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
14c00 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
14c10 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
14c20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
14c30 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
14c40 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
14c50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
14c60 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
14c70 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
14c80 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14c90 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
14ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
14cb0 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
14cc0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
14cd0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
14ce0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
14cf0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
14d00 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
14d10 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
14d20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
14d30 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
14d40 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
14d50 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
14d60 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
14d70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14d80 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
14d90 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
14da0 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58   }.    iTab = pX
14db0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
14dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14dd0 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
14de0 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
14df0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
14e00 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
14e10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
14e20 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20  TI_OR)==0 );.   
14e30 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
14e40 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  |= WHERE_IN_ABLE
14e50 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
14e60 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b  ->u.in.nIn==0 ){
14e70 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  .      pLevel->a
14e80 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
14e90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
14eb0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a  el->u.in.nIn++;.
14ec0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
14ed0 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20  .aInLoop =.     
14ee0 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
14ef0 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
14f00 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  >db, pLevel->u.i
14f10 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  n.aInLoop,.     
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
14f40 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
14f50 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d  Loop[0])*pLevel-
14f60 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20  >u.in.nIn);.    
14f70 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  pIn = pLevel->u.
14f80 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20  in.aInLoop;.    
14f90 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20  if( pIn ){.     
14fa0 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   pIn += pLevel->
14fb0 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20  u.in.nIn - 1;.  
14fc0 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20      pIn->iCur = 
14fd0 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  iTab;.      if( 
14fe0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
14ff0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
15000 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
15010 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15020 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
15030 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
15040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15050 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
15060 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
15070 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15080 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65  mn, iTab, 0, iRe
15090 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
150a0 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f    pIn->eEndLoopO
150b0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
150c0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
150d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
150f0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
15100 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
15110 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
15120 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15130 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
15140 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
15150 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
15160 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15170 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15180 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
15190 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
151a0 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
151b0 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
151c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
151d0 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
151e0 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
151f0 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
15200 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
15210 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
15220 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
15230 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
15240 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
15250 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
15260 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
15270 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15280 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
15290 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
152a0 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
152b0 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
152c0 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
152d0 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
152e0 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
152f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15300 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
15310 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
15320 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
15330 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
15340 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
15350 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
15360 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
15370 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
15380 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
15390 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
153a0 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
153b0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
153c0 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
153d0 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
153e0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
153f0 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
15400 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
15410 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
15420 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
15430 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
15440 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
15450 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
15460 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
15470 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
15480 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
15490 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
154a0 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
154b0 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
154c0 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
154d0 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
154e0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
154f0 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
15500 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
15510 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
15520 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
15530 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
15540 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
15550 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
15560 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
15570 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
15580 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
15590 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
155a0 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
155b0 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
155c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
155d0 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
155e0 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
155f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
15600 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
15610 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15620 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
15630 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
15640 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15650 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15660 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15670 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
15680 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
15690 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
156a0 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
156b0 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
156c0 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
156d0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
156e0 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
156f0 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
15700 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15710 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
15720 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
15730 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15740 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
15750 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
15760 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
15770 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
15780 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15790 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
157a0 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
157b0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
157c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
157d0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
157e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
157f0 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
15800 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
15810 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
15820 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
15830 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15840 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
15850 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
15860 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
15870 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
15880 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
15890 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
158a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
158b0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
158c0 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
158d0 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
158e0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
158f0 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
15900 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
15910 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15920 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
15930 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
15940 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
15950 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
15960 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
15970 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
15980 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15990 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
159a0 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
159b0 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
159c0 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
159d0 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
159e0 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
159f0 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
15a00 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
15a10 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
15a20 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
15a30 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
15a40 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
15a50 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
15a60 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
15a70 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
15a80 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
15a90 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
15aa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15ab0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15ac0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15ad0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
15ae0 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
15af0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
15b00 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
15b10 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
15b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15b30 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
15b40 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
15b50 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
15b60 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
15b70 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
15b80 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
15b90 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
15ba0 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
15bb0 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
15bc0 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
15bd0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
15be0 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
15c10 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
15c20 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
15c30 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
15c60 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
15c70 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
15c80 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
15c90 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
15ca0 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
15cb0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
15cc0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
15cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15ce0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
15cf0 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
15d00 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
15d10 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
15d20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
15d30 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
15d40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
15d50 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
15d60 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
15d70 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
15d80 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15da0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15db0 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
15de0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15e10 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
15e20 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
15e30 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
15e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
15e50 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
15e60 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
15e70 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
15e80 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
15e90 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
15ea0 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
15eb0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
15ec0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
15ed0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
15ee0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15ef0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
15f00 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
15f10 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
15f20 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
15f30 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
15f40 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
15f50 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
15f60 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
15f70 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
15f80 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
15f90 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
15fa0 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
15fb0 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
15fc0 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
15fd0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
15fe0 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
15ff0 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
16000 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
16010 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
16020 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
16030 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
16040 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
16050 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
16060 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
16070 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
16080 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16090 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
160a0 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
160b0 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
160c0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
160d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
160e0 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
160f0 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
16100 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
16110 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16120 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
16130 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
16140 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
16150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16160 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
16170 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
16180 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
16190 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
161a0 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 74 3a 4f 50  Rev?OP_SeekLt:OP
161b0 5f 53 65 65 6b 47 74 29 2c 0a 20 20 20 20 20 20  _SeekGt),.      
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
161e0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
161f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16200 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
16210 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16220 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
16230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16240 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
16250 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
16260 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16270 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16280 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
16290 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
162a0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
162b0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
162c0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
162d0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
162e0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
162f0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
16300 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16310 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
16320 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
16330 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
16340 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
16350 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
16360 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
16370 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
16380 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
16390 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
163a0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
163b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
163c0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
163d0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
163e0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
163f0 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
16400 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
16410 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
16420 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16430 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
16440 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16450 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16460 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
16470 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16480 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16490 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
164a0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
164b0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
164c0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
164d0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
164e0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
164f0 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
16500 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
16510 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16520 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16530 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
16540 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
16550 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
16560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16580 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
16590 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
165a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
165b0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
165c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
165d0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
165e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
165f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
16600 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
16610 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16620 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
16630 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
16640 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16650 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
16660 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
16670 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
16680 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
16690 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
166a0 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
166b0 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
166c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
166d0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
166e0 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
166f0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
16700 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
16710 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
16720 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
16730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16740 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
16750 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
16760 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
16770 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
16780 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
16790 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
167a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
167b0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
167c0 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
167d0 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
167e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
167f0 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
16800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16810 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
16820 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
16830 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
16840 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
16850 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
16860 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
16870 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
16880 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
16890 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
168a0 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
168b0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
168c0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
168d0 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
168e0 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
168f0 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
16900 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
16910 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
16920 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
16930 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
16940 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
16950 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
16960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16970 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
16980 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
16990 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169b0 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
169c0 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
169d0 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
169e0 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
169f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16a00 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
16a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
16a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16a30 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
16a40 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
16a50 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
16a60 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
16a70 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
16a80 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
16a90 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
16aa0 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73  Column, -1);.  s
16ab0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
16ac0 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
16ad0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
16ae0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
16af0 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "?", 1);.}../*
16b00 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
16b10 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
16b20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
16b30 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
16b40 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
16b50 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
16b60 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
16b70 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  g buffer contain
16b80 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f  ing a descriptio
16b90 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73  n.** of the subs
16ba0 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  et of table rows
16bb0 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20   scanned by the 
16bc0 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20  strategy in the 
16bd0 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51  form of an.** SQ
16be0 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72  L expression. Or
16bf0 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  , if all rows ar
16c00 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20  e scanned, NULL 
16c10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
16c20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
16c30 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
16c40 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
16c50 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
16c60 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
16c70 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
16c80 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
16c90 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
16ca0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
16cb0 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
16cc0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
16cd0 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
16ce0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
16cf0 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ned pointer poin
16d00 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
16d10 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
16d20 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  e3DbMalloc()..**
16d30 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
16d40 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
16d50 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
16d60 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20  the buffer when 
16d70 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  it is.** no long
16d80 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
16d90 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
16da0 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73  lainIndexRange(s
16db0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
16dc0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61  eLoop *pLoop, Ta
16dd0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
16de0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c  dex *pIndex = pL
16df0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
16e00 64 65 78 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d  dex;.  u16 nEq =
16e10 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
16e20 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70  nEq;.  u16 nSkip
16e30 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
16e40 65 2e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69  e.nSkip;.  int i
16e50 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
16e60 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
16e70 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d  ;.  i16 *aiColum
16e80 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
16e90 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
16ea0 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
16eb0 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  ==0 && (pLoop->w
16ec0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
16ed0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
16ee0 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
16ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
16f00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
16f10 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
16f20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
16f30 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
16f40 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
16f50 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
16f60 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
16f70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
16f80 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  q; i++){.    cha
16f90 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65  r *z = (i==pInde
16fa0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22  x->nKeyCol ) ? "
16fb0 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
16fc0 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
16fd0 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b  ;.    if( i>=nSk
16fe0 69 70 20 29 7b 0a 20 20 20 20 20 20 65 78 70 6c  ip ){.      expl
16ff0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
17000 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a  xt, i, z, "=");.
17010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17020 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
17030 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
17040 74 78 74 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  txt, " AND ", 5)
17050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17060 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
17070 78 74 2c 20 22 41 4e 59 28 22 2c 20 34 29 3b 0a  xt, "ANY(", 4);.
17080 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17090 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
170a0 2c 20 7a 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  , z, -1);.      
170b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
170c0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c  ppend(&txt, ")",
170d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   1);.    }.  }..
170e0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
170f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
17100 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
17110 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
17120 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  j==pIndex->nKeyC
17130 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  ol ) ? "rowid" :
17140 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
17150 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
17160 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
17170 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
17180 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
17190 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
171a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
171b0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
171c0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  ==pIndex->nKeyCo
171d0 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  l ) ? "rowid" : 
171e0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
171f0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
17200 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
17210 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b  txt, i, z, "<");
17220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
17230 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
17240 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
17250 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
17260 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
17270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17280 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
17290 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
172a0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
172b0 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
172c0 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
172d0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
172e0 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
172f0 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
17300 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
17310 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
17320 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
17330 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
17340 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
17350 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
17360 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
17370 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
17380 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
17390 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
173a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
173b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
173c0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
173d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
173e0 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
173f0 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
17400 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
17410 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
17420 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
17430 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
17440 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
17450 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17470 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
17480 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
17490 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
174a0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
174b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
174c0 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
174d0 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
174e0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
174f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
17500 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
17510 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
17520 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
17530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17540 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
17550 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
17560 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
17570 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17580 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
17590 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
175a0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64  ->iFrom];.    Vd
175b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
175c0 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56  pVdbe;      /* V
175d0 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  M being construc
175e0 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
175f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17600 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
17610 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
17620 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
17650 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
17660 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
17670 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
17680 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
17690 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
176a0 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
176b0 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176d0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
176e0 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
176f0 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72  CAN. */.    Wher
17700 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
17710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17720 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65   controlling Whe
17730 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
17740 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20  .    u32 flags; 
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74     /* Flags that
17770 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c   describe this l
17780 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f  oop */..    pLoo
17790 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
177a0 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  op;.    flags = 
177b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
177c0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57      if( (flags&W
177d0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
177e0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  | (wctrlFlags&WH
177f0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
17800 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Y) ) return;..  
17810 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c    isSearch = (fl
17820 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c  ags&(WHERE_BTM_L
17830 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
17840 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20  IMIT))!=0.      
17850 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
17860 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  &WHERE_VIRTUALTA
17870 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f  BLE)==0 && (pLoo
17880 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30  p->u.btree.nEq>0
17890 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  )).            |
178a0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57  | (wctrlFlags&(W
178b0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
178c0 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
178d0 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20  AX));..    zMsg 
178e0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
178f0 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61  (db, "%s", isSea
17900 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43  rch?"SEARCH":"SC
17910 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49  AN");.    if( pI
17920 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
17930 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
17940 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
17950 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55   zMsg, "%s SUBQU
17960 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49  ERY %d", zMsg,pI
17970 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  tem->iSelectId);
17980 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17990 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
179a0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
179b0 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22  g, "%s TABLE %s"
179c0 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
179d0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
179e0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
179f0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ias ){.      zMs
17a00 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17a10 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17a20 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  s AS %s", zMsg, 
17a30 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
17a40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
17a50 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50  lags & (WHERE_IP
17a60 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  K|WHERE_VIRTUALT
17a70 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26  ABLE))==0.     &
17a80 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e  & ALWAYS(pLoop->
17a90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
17aa0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
17ab0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
17ac0 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
17ad0 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65  (db, pLoop, pIte
17ae0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
17af0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17b00 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
17b30 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20  AUTO_INDEX) ? . 
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f    "%s USING AUTO
17b60 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30  MATIC %sINDEX%.0
17b70 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20  s%s" :.         
17b80 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
17b90 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25 73  ING %sINDEX %s%s
17ba0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
17bb0 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67      zMsg, ((flag
17bc0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
17bd0 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20  LY) ? "COVERING 
17be0 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20  " : ""),.       
17bf0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
17c00 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
17c10 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20  Name, zWhere);. 
17c20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17c30 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a  ee(db, zWhere);.
17c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
17c50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
17c60 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26  )!=0 && (flags &
17c70 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
17c80 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  T)!=0 ){.      z
17c90 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
17ca0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
17cb0 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45  "%s USING INTEGE
17cc0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  R PRIMARY KEY", 
17cd0 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66  zMsg);..      if
17ce0 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43  ( flags&(WHERE_C
17cf0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43  OLUMN_EQ|WHERE_C
17d00 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20  OLUMN_IN) ){.   
17d10 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
17d20 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
17d30 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
17d40 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  =?)", zMsg);.   
17d50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
17d60 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
17d70 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
17d80 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
17d90 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17da0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
17db0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
17dc0 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20   AND rowid<?)", 
17dd0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
17de0 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45  se if( flags&WHE
17df0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
17e00 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
17e10 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
17e20 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
17e30 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid>?)", zMsg);.
17e40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17e50 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48 45  ALWAYS(flags&WHE
17e60 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b  RE_TOP_LIMIT) ){
17e70 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
17e80 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17e90 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
17ea0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
17eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17ec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17ed0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17ee0 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
17ef0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
17f00 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
17f10 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
17f20 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
17f30 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55   zMsg, "%s VIRTU
17f40 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
17f50 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17f70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
17f80 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
17f90 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
17fa0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73  }.#endif.    zMs
17fb0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17fc0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17fd0 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73  s", zMsg);.    s
17fe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17ff0 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
18000 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72  iId, iLevel, iFr
18010 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  om, zMsg, P4_DYN
18020 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
18030 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
18040 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77  ainOneScan(u,v,w
18050 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
18060 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
18070 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  PLAIN */.../*.**
18080 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
18090 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
180a0 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
180b0 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
180c0 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
180d0 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
180e0 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
180f0 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
18100 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
18110 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
18120 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
18130 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
18140 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
18150 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18160 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
18170 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
18180 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
18190 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
181a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
181b0 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
181c0 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
181d0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
181e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
181f0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
18200 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
18210 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
18220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18230 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
18240 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
18250 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
18260 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
18270 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
18280 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
18290 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
182a0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
182b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
182c0 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
182d0 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
182e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
182f0 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
18300 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
18310 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
18320 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
18330 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
18340 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
18350 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
18360 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54   *pLoop;    /* T
18370 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
18380 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ect being coded 
18390 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
183a0 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
183b0 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
183c0 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
183d0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
183e0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
183f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18400 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
18410 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
18420 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
18430 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18440 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
18450 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18470 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
18480 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
18490 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
184a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
184b0 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
184c0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
184d0 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
184e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
184f0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
18500 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
18510 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
18520 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18540 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
18550 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
18560 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
18570 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
18580 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
18590 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
185a0 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
185b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
185c0 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
185d0 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
185e0 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
185f0 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
18600 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
18610 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
18620 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
18630 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
18640 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
18650 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
18660 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
18670 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18680 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
18690 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  sWC;.  db = pPar
186a0 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c  se->db;.  pLevel
186b0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
186c0 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d  evel];.  pLoop =
186d0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
186e0 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70  .  pTabItem = &p
186f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
18700 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
18710 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62  ];.  iCur = pTab
18720 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
18730 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
18740 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e  y = notReady & ~
18750 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
18760 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
18770 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e  ;.  bRev = (pWIn
18780 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65  fo->revMask>>iLe
18790 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61  vel)&1;.  omitTa
187a0 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  ble = (pLoop->ws
187b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
187c0 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
187d0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
187e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
187f0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
18800 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f  E)==0;.  VdbeNoo
18810 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
18820 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64  gin WHERE-loop%d
18830 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61  : %s",iLevel,pTa
18840 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
18850 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  me));..  /* Crea
18860 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
18870 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
18880 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
18890 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
188a0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
188b0 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
188c0 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
188d0 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
188e0 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
188f0 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
18900 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
18910 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
18920 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
18930 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
18940 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
18950 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
18960 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
18970 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
18980 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
18990 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
189a0 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
189b0 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
189c0 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
189d0 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
189e0 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
189f0 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
18a00 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
18a10 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
18a20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
18a30 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
18a40 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
18a50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18a60 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
18a70 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
18a80 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
18a90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18aa0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
18ab0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
18ac0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
18ad0 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
18ae0 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
18af0 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
18b00 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
18b10 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
18b20 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
18b30 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
18b40 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
18b50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
18b60 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
18b70 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
18b80 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
18b90 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
18ba0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
18bb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18bd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
18be0 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
18bf0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
18c00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
18c10 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
18c20 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
18c30 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
18c40 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d  l case of a FROM
18c50 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79   clause subquery
18c60 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
18c70 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
18c80 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
18c90 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
18ca0 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
18cb0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
18cc0 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  Return;.    sqli
18cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18ce0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
18cf0 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
18d00 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b  ub-1, regYield);
18d10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
18d20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
18d30 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
18d40 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
18d50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18d60 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f   "next row of co
18d70 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54  -routine %s", pT
18d80 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
18d90 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ame));.    sqlit
18da0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18db0 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b  OP_If, regYield+
18dc0 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  1, addrBrk);.   
18dd0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
18de0 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
18df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18e00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
18e10 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
18e20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18e30 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
18e40 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
18e50 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
18e60 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
18e70 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
18e80 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
18e90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
18ea0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
18eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
18ec0 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
18ed0 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
18ee0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
18ef0 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
18f00 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
18f10 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
18f20 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
18f30 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
18f40 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
18f50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
18f60 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
18f70 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
18f80 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
18f90 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
18fa0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
18fb0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
18fc0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
18fd0 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
18fe0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
18ff0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
19000 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
19010 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
19020 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
19030 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
19040 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
19050 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
19060 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
19070 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
19080 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
19090 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
190a0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
190b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
190c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
190d0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
190e0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
190f0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
19100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19120 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
19130 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19140 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
19150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19160 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19170 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
19180 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
19190 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
191a0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
191b0 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
191c0 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
191d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
191e0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
191f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19200 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
19210 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
19220 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
19230 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c  _STATIC);.    pL
19240 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
19250 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Free = 0;.    fo
19260 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
19270 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b  aint && j<16; j+
19280 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
19290 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  Loop->u.vtab.omi
192a0 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20  tMask>>j)&1 ){. 
192b0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
192c0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70  rm(pLevel, pLoop
192d0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20  ->aLTerm[j]);.  
192e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
192f0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
19300 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
19310 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
19320 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
19330 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19340 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
19350 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19360 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
19370 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
19380 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  2);.    sqlite3E
19390 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
193a0 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  se, 1);.  }else.
193b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
193c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
193d0 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c  LE */..  if( (pL
193e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
193f0 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
19400 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
19410 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
19420 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
19430 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a  MN_EQ))!=0.  ){.
19440 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
19450 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
19460 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
19470 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
19480 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
19490 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
194a0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
194b0 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
194c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
194d0 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
194e0 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
194f0 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
19500 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
19510 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
19520 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19530 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
19540 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  e.nEq==1 );.    
19550 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
19560 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19570 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
19580 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
19590 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
195a0 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
195b0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
195c0 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
195d0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
195e0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ble==0 );.    te
195f0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
19600 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
19610 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f  RTUAL );.    iRo
19620 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
19630 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
19640 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
19650 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
19660 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
19670 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
19680 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
19690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
196a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
196b0 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
196c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
196d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
196e0 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
196f0 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
19700 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
19710 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
19720 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
19730 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
19740 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19750 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
19760 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
19770 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
19780 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
19790 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
197a0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
197b0 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
197c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
197d0 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
197e0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
197f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
19800 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
19810 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
19820 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
19830 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
19840 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
19850 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
19860 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
19870 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
19880 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
19890 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
198a0 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
198b0 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
198c0 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
198d0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
198e0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
198f0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
19900 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
19910 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19920 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
19930 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
19940 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
19950 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
19960 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
19970 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
19980 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
19990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
199a0 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
199b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
199c0 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
199d0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
199e0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
199f0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
19a00 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
19a10 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
19a20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
19a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
19a40 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
19a50 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
19a60 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
19a70 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
19a80 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
19a90 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
19aa0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
19ab0 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
19ac0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
19ad0 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
19ae0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
19af0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
19b00 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
19b10 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
19b20 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
19b30 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
19b40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
19b50 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
19b60 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
19b70 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
19b80 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
19b90 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
19ba0 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
19bb0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
19bc0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
19bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
19be0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
19bf0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
19c00 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
19c10 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
19c20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
19c30 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
19c40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
19c50 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
19c60 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
19c70 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
19c80 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19c90 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
19ca0 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
19cb0 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
19cc0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
19cd0 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
19ce0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
19cf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
19d00 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
19d10 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19d20 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
19d30 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
19d40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19d50 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
19d60 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
19d70 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
19d80 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
19d90 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
19da0 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
19db0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19dc0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
19dd0 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
19de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19df0 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
19e00 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
19e10 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
19e20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
19e30 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
19e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19e50 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
19e60 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
19e70 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
19e80 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19e90 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
19ea0 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
19eb0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
19ec0 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
19ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
19ef0 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
19f00 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
19f10 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
19f20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
19f30 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
19f40 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
19f50 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
19f60 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
19f70 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64     assert( (pEnd
19f80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19f90 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
19fa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
19fb0 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  nd->leftCursor!=
19fc0 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73  iCur ); /* Trans
19fd0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
19fe0 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
19ff0 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61  ase( pEnd->wtFla
1a000 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1a010 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e  L );.      memEn
1a020 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73  dValue = ++pPars
1a030 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1a040 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1a050 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1a060 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b  t, memEndValue);
1a070 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f  .      if( pX->o
1a080 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
1a090 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
1a0a0 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
1a0b0 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
1a0c0 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
1a0d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1a0e0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
1a0f0 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
1a100 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1a110 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
1a120 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
1a130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a140 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1a150 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
1a160 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1a170 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
1a180 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1a190 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1a1a0 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65   start;.    asse
1a1b0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
1a1c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73  0 );.    if( tes
1a1d0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
1a1e0 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
1a1f0 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
1a200 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1a210 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1a220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a230 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1a240 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1a250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a260 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1a270 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1a280 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1a290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a2a0 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1a2b0 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1a2c0 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1a2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a2e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1a2f0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1a300 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1a310 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1a320 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1a330 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a340 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1a350 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1a360 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1a370 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a380 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1a390 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1a3a0 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1a3b0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1a3c0 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1a3d0 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1a3e0 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1a3f0 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1a400 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1a410 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1a420 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1a430 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1a440 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1a450 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1a460 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1a470 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1a480 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1a490 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1a4a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1a4b0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1a4c0 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1a4d0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1a4e0 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1a4f0 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1a500 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1a510 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1a520 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1a530 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1a540 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1a550 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1a560 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1a570 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1a580 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1a590 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1a5a0 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1a5b0 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1a5c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1a5d0 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1a5e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1a5f0 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1a600 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1a610 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1a620 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1a630 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1a640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a650 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1a660 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1a670 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1a680 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1a690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1a6a0 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1a6b0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1a6c0 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1a6d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a6e0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1a6f0 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1a700 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1a710 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1a720 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1a730 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1a740 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1a750 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1a760 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1a770 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1a780 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1a790 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1a7a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1a7b0 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1a7c0 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1a7d0 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1a7e0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1a7f0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1a800 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1a810 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1a820 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1a830 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1a840 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1a850 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1a860 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1a870 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1a880 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1a890 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1a8a0 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1a8b0 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1a8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1a8d0 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1a8e0 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1a8f0 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1a900 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1a910 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1a920 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1a930 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1a940 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1a950 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1a960 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1a970 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1a980 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1a990 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1a9a0 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1a9b0 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1a9c0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1a9d0 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1a9e0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1a9f0 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1aa00 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1aa10 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1aa20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1aa30 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1aa40 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1aa50 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1aa60 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1aa70 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1aa80 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1aa90 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1aaa0 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1aab0 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1aac0 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1aad0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1aae0 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1aaf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ab00 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1ab10 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1ab20 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1ab40 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1ab50 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1ab60 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45     };.    u16 nE
1ab70 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1ab80 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e  ee.nEq;     /* N
1ab90 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1aba0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
1abb0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
1abc0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
1abd0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
1abe0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
1abf0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
1ac00 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1ac10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1ac20 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1ac30 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
1ac40 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
1ac50 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
1ac60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1ac70 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
1ac80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1ac90 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1aca0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1acb0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1acc0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1acd0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1ace0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1acf0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1ad00 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1ad10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1ad20 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1ad30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ad40 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1ad50 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1ad60 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1ad90 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1ada0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1adb0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1adc0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1add0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1ade0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1adf0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1ae00 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1ae10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1ae20 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1ae30 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1ae40 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1ae50 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1ae60 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1ae70 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1ae80 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1ae90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1aea0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1aeb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1aec0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1aed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1aee0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1aef0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
1af00 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
1af30 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
1af40 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af60 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
1af70 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
1af80 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
1af90 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b 20  ar cEndAff = 0; 
1afa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1afb0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
1afc0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1afd0 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
1afe0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1aff0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
1b000 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1b010 49 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65  IdxCur;.    asse
1b020 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e  rt( nEq>=pLoop->
1b030 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b  u.btree.nSkip );
1b040 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1b050 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1b060 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1b070 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1b080 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1b090 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1b0a0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1b0b0 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1b0c0 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1b0d0 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1b0e0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1b0f0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1b100 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1b110 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1b120 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1b130 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1b140 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1b150 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1b160 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1b170 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1b180 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1b190 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1b1a0 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1b1b0 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1b1c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1b1d0 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1b1e0 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1b1f0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1b200 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1b210 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1b220 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1b230 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1b240 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1b250 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20  >bOBSat!=0).    
1b260 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
1b270 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ol>nEq).    ){. 
1b280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
1b290 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
1b2a0 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  p==0 );.      is
1b2b0 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20  MinQuery = 1;.  
1b2c0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1b2d0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1b2e0 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61   Find any inequa
1b2f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1b300 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74  terms for the st
1b310 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20  art and end .   
1b320 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
1b330 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20  . .    */.    j 
1b340 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1b350 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1b360 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1b370 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53  ){.      pRangeS
1b380 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1b390 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1b3a0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1b3b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
1b3c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b3d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1b3e0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
1b3f0 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
1b400 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
1b410 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b420 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
1b430 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1b440 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
1b450 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
1b460 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
1b470 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
1b480 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
1b490 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
1b4a0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
1b4b0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1b4c0 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
1b4d0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
1b4e0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
1b4f0 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c  ms(pParse,pLevel
1b500 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c  ,bRev,nExtraReg,
1b510 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20  &zStartAff);.   
1b520 20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74 41   assert( zStartA
1b530 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ff==0 || sqlite3
1b540 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41  Strlen30(zStartA
1b550 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20  ff)>=nEq );.    
1b560 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 20  if( zStartAff ) 
1b570 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74  cEndAff = zStart
1b580 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64  Aff[nEq];.    ad
1b590 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
1b5a0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
1b5b0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1b5c0 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
1b5d0 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
1b5e0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
1b5f0 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
1b600 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1b610 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
1b620 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
1b630 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
1b640 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
1b650 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
1b660 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
1b670 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
1b680 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26  pIdx->nKeyCol &&
1b690 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
1b6a0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
1b6b0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
1b6c0 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
1b6d0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  pIdx->nKeyCol==n
1b6e0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1b6f0 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
1b700 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
1b710 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1b720 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
1b730 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
1b740 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
1b750 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
1b760 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b770 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1b780 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
1b790 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b7a0 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _GE)!=0 );.    t
1b7b0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1b7c0 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
1b7d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b7e0 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
1b7f0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1b800 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
1b810 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b820 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73  _GE)!=0 );.    s
1b830 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
1b840 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
1b850 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1b860 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1b870 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
1b880 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
1b890 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1b8a0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
1b8b0 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
1b8c0 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
1b8d0 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
1b8e0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
1b8f0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
1b900 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1b910 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1b920 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
1b930 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
1b940 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
1b950 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1b960 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
1b970 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1b980 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b990 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
1b9a0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1b9b0 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
1b9c0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1b9d0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1b9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b9f0 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
1ba00 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
1ba10 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1ba20 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
1ba30 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1ba40 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1ba50 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1ba60 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1ba70 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1ba80 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1ba90 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1baa0 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1bab0 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1bac0 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1bad0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1bae0 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1baf0 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1bb00 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1bb10 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1bb20 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1bb30 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1bb40 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1bb50 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1bb60 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1bb70 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1bb80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1bb90 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1bba0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1bbb0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1bbc0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1bbd0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1bbe0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1bbf0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1bc00 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1bc10 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1bc20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bc30 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1bc40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1bc50 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1bc60 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
1bc70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bc80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bc90 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
1bca0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
1bcb0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1bcc0 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
1bcd0 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
1bce0 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
1bcf0 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
1bd00 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1bd10 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1bd20 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66  traint, zStartAf
1bd30 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
1bd40 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
1bd50 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
1bd60 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
1bd70 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
1bd80 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65   op!=0 );.    te
1bd90 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
1bda0 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73  ewind );.    tes
1bdb0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
1bdc0 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
1bdd0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
1bde0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
1bdf0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65  e( op==OP_SeekGe
1be00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1be10 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( op==OP_SeekLe 
1be20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1be30 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29   op==OP_SeekLt )
1be40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1be50 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
1be60 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
1be70 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
1be80 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20  nstraint);..    
1be90 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
1bea0 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
1beb0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1bec0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1bed0 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
1bee0 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
1bef0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
1bf00 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1bf10 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
1bf20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
1bf30 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
1bf40 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1bf50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bf60 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1bf70 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
1bf80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bf90 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1bfa0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
1bfb0 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
1bfc0 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1bfd0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1bfe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1bff0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
1c000 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
1c010 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
1c020 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
1c030 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
1c040 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1c050 69 74 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64  ity(pRight, cEnd
1c060 41 66 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  Aff)!=SQLITE_AFF
1c070 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20  _NONE.       && 
1c080 21 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64  !sqlite3ExprNeed
1c090 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1c0a0 65 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66  e(pRight, cEndAf
1c0b0 66 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  f).      ){.    
1c0c0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
1c0d0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
1c0e0 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63  gBase+nEq, 1, &c
1c0f0 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d  EndAff);.      }
1c100 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1c110 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
1c120 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d  case( pRangeEnd-
1c130 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1c140 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
1c150 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1c160 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
1c170 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
1c180 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
1c190 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
1c1a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1c1b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
1c1c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1c1d0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1c1e0 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
1c1f0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
1c200 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
1c210 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
1c220 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
1c230 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
1c240 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
1c250 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1c260 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
1c270 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c280 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
1c290 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
1c2a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c2b0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1c2c0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
1c2d0 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
1c2e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
1c2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c300 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
1c310 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
1c320 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c330 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1c340 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1c350 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
1c360 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
1c370 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c380 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
1c390 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
1c3a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1c3b0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
1c3c0 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
1c3d0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
1c3e0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
1c3f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1c400 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1c410 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c420 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1c430 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1c440 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c450 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1c460 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1c470 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  T );.    if( (pL
1c480 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
1c490 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
1c4a0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1c4b0 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 6a  )!=0 .     && (j
1c4c0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c4d0 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20  n[nEq])>=0 .    
1c4e0 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
1c4f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1c500 6c 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  l==0 .    ){.   
1c510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c520 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1c530 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
1c540 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1c550 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
1c560 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  , pIdx->pTable->
1c570 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 29 3b  aCol[j].zName));
1c580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c590 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c5a0 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
1c5b0 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
1c5c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c5d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1c5e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  );..    /* Seek 
1c5f0 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
1c600 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
1c610 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
1c620 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
1c630 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
1c640 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1c650 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
1c660 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  f( omitTable ){.
1c670 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73        /* pIdx is
1c680 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1c690 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61  x.  No need to a
1c6a0 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20 74  ccess the main t
1c6b0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c  able. */.    }el
1c6c0 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1c6d0 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b  pIdx->pTable) ){
1c6e0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1c6f0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1c700 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1c710 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1c720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c730 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
1c740 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
1c750 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1c760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1c770 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1c780 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1c790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c7a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c7b0 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
1c7c0 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
1c7d0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
1c7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1c7f0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
1c800 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
1c810 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29  ex(pIdx->pTable)
1c820 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  ;.      iRowidRe
1c830 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1c840 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1c850 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  pPk->nKeyCol);. 
1c860 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1c870 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
1c880 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
1c890 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1c8a0 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e  ndex(pIdx, pPk->
1c8b0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20  aiColumn[j]);.  
1c8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c8d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1c8e0 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b  lumn, iIdxCur, k
1c8f0 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a  , iRowidReg+j);.
1c900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1c920 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
1c930 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e  d, iCur, addrCon
1c940 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52                iR
1c960 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b  owidReg, pPk->nK
1c970 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  eyCol);.    }.. 
1c980 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
1c990 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
1c9a0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
1c9b0 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
1c9c0 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
1c9d0 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
1c9e0 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
1c9f0 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
1ca00 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
1ca10 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ca20 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1ca30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1ca40 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1ca50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
1ca60 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
1ca70 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
1ca80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ca90 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1caa0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
1cab0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1cac0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28  iIdxCur;.    if(
1cad0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1cae0 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
1caf0 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  INT)==0 ){.     
1cb00 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
1cb10 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
1cb20 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
1cb30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cb40 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1cb50 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
1cb60 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
1cb70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
1cb80 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
1cb90 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cba0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1cbb0 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
1cbc0 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   5:  Two or more
1cbd0 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
1cbe0 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
1cbf0 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
1cc00 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1cc10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1cc20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1cc30 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
1cc40 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1cc50 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
1cc60 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1cc70 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
1cc80 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1cc90 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
1cca0 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
1ccb0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1ccc0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
1ccd0 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
1cce0 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
1ccf0 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
1cd00 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
1cd10 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
1cd20 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
1cd30 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
1cd40 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
1cd50 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
1cd60 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1cd70 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
1cd80 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
1cd90 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
1cda0 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
1cdb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1cdc0 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
1cdd0 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
1cde0 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
1cdf0 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
1ce00 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
1ce10 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
1ce20 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
1ce30 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
1ce40 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
1ce50 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
1ce60 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
1ce70 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
1ce80 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
1ce90 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
1cea0 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
1ceb0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
1cec0 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
1ced0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
1cee0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1cef0 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
1cf00 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
1cf10 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1cf30 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
1cf40 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
1cf50 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
1cf60 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
1cf70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1cf80 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
1cf90 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
1cfa0 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
1cfb0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1cfc0 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
1cfd0 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
1cfe0 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
1cff0 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
1d000 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
1d010 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
1d020 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
1d030 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
1d040 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
1d050 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
1d060 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
1d070 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
1d080 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
1d0b0 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
1d0c0 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
1d0d0 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
1d0e0 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
1d0f0 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
1d100 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
1d110 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
1d120 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
1d130 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
1d140 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
1d150 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1d160 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
1d170 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
1d180 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
1d190 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
1d1a0 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
1d1b0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
1d1c0 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
1d1d0 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
1d1e0 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
1d1f0 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
1d200 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
1d210 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
1d220 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d240 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
1d250 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
1d260 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
1d270 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
1d280 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
1d290 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
1d2a0 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
1d2b0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
1d2c0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
1d2d0 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
1d2e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
1d2f0 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
1d300 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
1d310 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
1d340 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
1d350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
1d360 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1d390 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
1d3a0 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
1d3b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1d3c0 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
1d3d0 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
1d3e0 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
1d3f0 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1d420 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
1d430 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
1d440 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
1d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
1d460 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
1d470 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
1d480 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1d4b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1d4c0 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d  Expr *pAndExpr =
1d4d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d4e0 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44     /* An ".. AND
1d4f0 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
1d500 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54  on */.   .    pT
1d510 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1d520 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1d530 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1d540 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1d550 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1d560 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
1d570 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
1d580 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
1d590 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
1d5a0 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
1d5b0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1d5c0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1d5d0 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
1d5e0 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
1d5f0 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
1d600 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
1d610 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
1d620 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
1d630 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
1d640 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
1d650 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
1d660 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
1d670 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
1d680 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
1d690 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
1d6a0 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
1d6b0 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1d6c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1d6d0 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
1d6e0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
1d6f0 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
1d700 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
1d710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d720 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1d730 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
1d740 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
1d750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1d760 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
1d770 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
1d780 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
1d790 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
1d7a0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
1d7b0 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
1d7c0 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
1d7d0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
1d7e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d800 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
1d810 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
1d820 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
1d830 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
1d840 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
1d850 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
1d860 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
1d870 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  u8)(nNotReady + 
1d880 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
1d890 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
1d8a0 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
1d8b0 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
1d8c0 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
1d8d0 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
1d8e0 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
1d8f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1d900 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
1d910 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
1d920 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
1d930 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
1d940 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
1d950 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
1d960 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1d970 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
1d980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d990 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
1d9a0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
1d9b0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
1d9c0 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
1d9d0 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
1d9e0 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
1d9f0 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
1da00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
1da10 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
1da20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
1da30 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
1da40 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
1da50 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
1da60 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1da70 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
1da80 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
1da90 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
1daa0 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
1dab0 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
1dac0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
1dad0 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
1dae0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
1daf0 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
1db00 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
1db10 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
1db20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
1db30 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
1db40 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
1db50 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
1db60 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
1db70 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
1db80 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
1db90 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
1dba0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
1dbb0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
1dbc0 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
1dbd0 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
1dbe0 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
1dbf0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
1dc00 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
1dc10 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1dc20 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1dc30 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
1dc40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
1dc50 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
1dc60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
1dc70 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
1dc80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1dc90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dca0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1dcb0 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
1dcc0 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
1dcd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dce0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1dcf0 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
1dd00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1dd10 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
1dd20 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
1dd30 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
1dd40 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
1dd50 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
1dd60 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
1dd70 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
1dd80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
1dd90 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
1dda0 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
1ddb0 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
1ddc0 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
1ddd0 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
1dde0 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
1ddf0 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
1de00 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
1de10 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1de20 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
1de30 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
1de40 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
1de50 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
1de60 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
1de70 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
1de80 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
1de90 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
1dea0 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
1deb0 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
1dec0 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
1ded0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1dee0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
1def0 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
1df00 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
1df10 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
1df20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
1df30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
1df40 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
1df50 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
1df60 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
1df70 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1df80 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
1df90 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1dfa0 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
1dfb0 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
1dfc0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
1dfd0 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
1dfe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1dff0 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
1e000 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
1e010 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
1e020 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
1e030 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
1e040 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1e050 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
1e060 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
1e070 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69     if( &pWC->a[i
1e080 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29  Term] == pTerm )
1e090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e0a0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e0b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e0c0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
1e0d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1e0e0 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  f( pWC->a[iTerm]
1e0f0 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  .wtFlags & (TERM
1e100 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69  _ORINFO) ) conti
1e110 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1e120 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e   (pWC->a[iTerm].
1e130 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
1e140 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  LL)==0 ) continu
1e150 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e;.        pExpr
1e160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1e170 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
1e180 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1e190 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
1e1a0 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c  nd(db, pAndExpr,
1e1b0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
1e1c0 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45  .      if( pAndE
1e1d0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
1e1e0 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
1e1f0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1e200 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78  K_AND, 0, pAndEx
1e210 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
1e220 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
1e230 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
1e240 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
1e250 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1e260 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
1e270 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
1e280 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
1e290 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70  rsor==iCur || (p
1e2a0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1e2b0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1e2c0 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
1e2d0 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
1e2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1e2f0 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
1e300 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
1e310 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70      Expr *pOrExp
1e320 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  r = pOrTerm->pEx
1e330 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
1e340 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78 70  pAndExpr && !Exp
1e350 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
1e360 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
1e370 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
1e380 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
1e390 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20  = pOrExpr;.     
1e3a0 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70       pOrExpr = p
1e3b0 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20  AndExpr;.       
1e3c0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f   }.        /* Lo
1e3d0 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
1e3e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
1e3f0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
1e400 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
1e410 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
1e420 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1e430 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
1e440 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45    WHERE_OMIT_OPE
1e470 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f  N_CLOSE | WHERE_
1e480 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20  AND_ONLY |.     
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
1e4b0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
1e4c0 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76  TABLE_ONLY, iCov
1e4d0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
1e4e0 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
1e4f0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1e500 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1e510 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
1e520 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
1e530 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
1e540 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
1e550 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
1e560 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
1e570 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
1e580 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66  OrTab, &pSubWInf
1e590 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c  o->a[0], iLevel,
1e5a0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
1e5b0 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  0.          );. 
1e5c0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
1e5d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1e5e0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
1e5f0 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
1e600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
1e610 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
1e620 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
1e630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e640 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
1e650 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
1e660 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1e670 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
1e680 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c  >pTab, -1, iCur,
1e690 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f             regRo
1e6c0 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
1e6d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e6e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1e6f0 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
1e700 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  owset,.         
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e730 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1e740 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20  )+2, r, iSet);. 
1e750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1e780 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
1e790 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
1e7a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
1e7b0 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
1e7c0 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
1e7d0 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
1e7e0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
1e7f0 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
1e800 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
1e810 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
1e820 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
1e830 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
1e840 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
1e850 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
1e860 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
1e870 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
1e880 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
1e890 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
1e8a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1e8b0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
1e8c0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
1e8d0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
1e8e0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1e8f0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
1e900 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
1e910 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
1e920 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
1e930 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1e940 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
1e950 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
1e960 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
1e970 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
1e980 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
1e990 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1e9a0 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
1e9b0 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
1e9c0 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
1e9d0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
1e9e0 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
1e9f0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1ea00 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
1ea10 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
1ea20 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
1ea30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
1ea40 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
1ea50 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
1ea60 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
1ea70 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
1ea80 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
1ea90 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
1eaa0 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
1eab0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
1eac0 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
1ead0 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
1eae0 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
1eaf0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1eb00 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
1eb10 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
1eb20 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
1eb30 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
1eb40 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
1eb50 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
1eb60 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
1eb70 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
1eb80 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
1eb90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1eba0 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
1ebb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ebc0 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
1ebd0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
1ebe0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
1ebf0 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
1ec00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ec10 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
1ec20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1ec30 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
1ec40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1ec50 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
1ec60 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
1ec70 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
1ec80 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
1ec90 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
1eca0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1ecb0 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  ( pSubWInfo->a[0
1ecc0 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43  ].iIdxCur==iCovC
1ecd0 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ur );.          
1ece0 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f    pCov = pSubLoo
1ecf0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1ed00 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  x;.          }el
1ed10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1ed20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
1ed30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1ed40 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
1ed50 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
1ed60 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
1ed70 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
1ed80 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
1ed90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1eda0 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
1edb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1edc0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1edd0 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76  u.pCovidx = pCov
1ede0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29  ;.    if( pCov )
1edf0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1ee00 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20   = iCovCur;.    
1ee10 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
1ee20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
1ee30 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
1ee40 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1ee50 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29  te(db, pAndExpr)
1ee60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ee70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
1ee80 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
1ee90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1eea0 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
1eeb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eec0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
1eed0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1eee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1eef0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1ef00 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
1ef10 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
1ef20 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
1ef30 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
1ef40 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
1ef50 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
1ef60 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1ef70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
1ef80 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1ef90 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
1efa0 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
1efb0 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
1efc0 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
1efd0 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
1efe0 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
1eff0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f000 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
1f010 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
1f020 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
1f030 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
1f040 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
1f050 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
1f060 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
1f070 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
1f080 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
1f090 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
1f0a0 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
1f0b0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f0c0 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
1f0d0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1f0e0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1f0f0 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
1f100 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
1f110 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
1f120 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1f130 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
1f140 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
1f150 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
1f160 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
1f170 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
1f180 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
1f190 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
1f1a0 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
1f1b0 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
1f1c0 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
1f1d0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
1f1e0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1f1f0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
1f200 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
1f210 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
1f220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f230 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1f240 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1f250 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1f260 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1f270 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
1f280 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1f290 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
1f2a0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
1f2b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1f2c0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1f2d0 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
1f2e0 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
1f2f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
1f300 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1f310 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
1f320 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1f330 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f340 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1f350 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
1f360 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
1f370 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
1f380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1f390 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
1f3a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
1f3b0 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
1f3c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
1f3d0 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
1f3e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
1f3f0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1f400 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f410 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f420 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f430 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
1f440 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
1f450 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
1f460 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
1f470 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
1f480 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
1f490 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
1f4a0 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
1f4b0 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
1f4c0 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
1f4d0 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
1f4e0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1f4f0 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
1f500 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
1f510 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
1f520 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
1f530 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
1f540 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
1f550 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
1f560 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
1f570 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
1f580 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
1f590 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
1f5a0 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
1f5b0 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
1f5c0 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
1f5d0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
1f5e0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1f5f0 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
1f600 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
1f610 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
1f620 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20  *pE, *pEAlt;.   
1f630 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
1f640 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1f650 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
1f660 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
1f670 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
1f680 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1f690 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
1f6a0 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
1f6b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1f6c0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1f6d0 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
1f6e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
1f6f0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
1f700 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
1f710 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1f720 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1f730 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f740 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1f750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1f760 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1f770 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  t & pLevel->notR
1f780 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
1f790 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  pAlt = findTerm(
1f7a0 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d  pWC, iCur, pTerm
1f7b0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20  ->u.leftColumn, 
1f7c0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
1f7d0 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IN, 0);.    i
1f7e0 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
1f7f0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1f800 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
1f810 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
1f820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74  ntinue;.    test
1f830 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
1f840 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
1f850 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1f860 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
1f870 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64   WO_IN );.    Vd
1f880 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1f890 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74  , "begin transit
1f8a0 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29  ive constraint")
1f8b0 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73  );.    pEAlt = s
1f8c0 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
1f8d0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
1f8e0 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28  pEAlt));.    if(
1f8f0 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20   pEAlt ){.      
1f900 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e  *pEAlt = *pAlt->
1f910 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41  pExpr;.      pEA
1f920 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  lt->pLeft = pE->
1f930 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c  pLeft;.      sql
1f940 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f950 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61  pParse, pEAlt, a
1f960 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
1f970 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f980 20 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46     sqlite3StackF
1f990 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a  ree(db, pEAlt);.
1f9a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f9b0 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
1f9c0 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
1f9d0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
1f9e0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
1f9f0 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
1fa00 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
1fa10 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
1fa20 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
1fa30 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
1fa40 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1fa50 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
1fa60 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
1fa70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1fa80 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1fa90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1faa0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1fab0 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
1fac0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
1fad0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1fae0 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
1faf0 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
1fb00 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1fb10 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
1fb20 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
1fb30 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
1fb40 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
1fb50 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1fb60 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1fb70 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1fb80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1fb90 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
1fba0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
1fbb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1fbc0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
1fbd0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
1fbe0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
1fbf0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
1fc00 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
1fc10 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
1fc20 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
1fc30 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
1fc40 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1fc50 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
1fc60 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1fc70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1fc80 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
1fc90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1fca0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
1fcb0 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
1fcc0 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
1fcd0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
1fce0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
1fcf0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
1fd00 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
1fd10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1fd20 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
1fd30 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c  g);..  return pL
1fd40 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a  evel->notReady;.
1fd50 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  }..#if defined(W
1fd60 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1fd70 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
1fd80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1fd90 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
1fda0 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e  Generate "Explan
1fdb0 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20  ation" text for 
1fdc0 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a  a WhereTerm..*/.
1fdd0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
1fde0 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62  eExplainTerm(Vdb
1fdf0 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20  e *v, WhereTerm 
1fe00 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20  *pTerm){.  char 
1fe10 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63  zType[4];.  memc
1fe20 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
1fe30 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   4);.  if( pTerm
1fe40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1fe50 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
1fe60 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28  [0] = 'V';.  if(
1fe70 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1fe80 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
1fe90 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
1fea0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1feb0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
1fec0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1fed0 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
1fee0 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ';.  sqlite3Expl
1fef0 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73  ainPrintf(v, "%s
1ff00 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71   ", zType);.  sq
1ff10 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1ff20 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (v, pTerm->pExpr
1ff30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57  );.}.#endif /* W
1ff40 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1ff50 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  D && SQLITE_ENAB
1ff60 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20  LE_TREE_EXPLAIN 
1ff70 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
1ff80 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
1ff90 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
1ffa0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
1ffb0 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
1ffc0 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
1ffd0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
1ffe0 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
1fff0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
20000 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
20010 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
20020 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
20030 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
20040 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
20050 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
20060 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
20070 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
20080 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
20090 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
200a0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
200b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
200c0 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
200d0 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
200e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
200f0 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
20100 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
20110 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
20120 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20130 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
20160 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
20170 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
20180 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
20190 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
201a0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
201b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
201c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20  zName;.     if( 
201d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
201e0 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
201f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
20200 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
20210 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
20220 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
20230 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
20240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
20250 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
20260 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
20270 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
20280 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
20290 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
202a0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
202b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
202c0 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
202d0 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
202e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
202f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20300 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20310 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
20320 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20330 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
20340 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
20350 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
20360 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
20370 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
20380 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
20390 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
203a0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
203b0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
203c0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
203d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
203e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
203f0 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
20400 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
20410 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
20420 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
20430 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20440 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
20450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20460 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
20470 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
20480 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
20490 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
204a0 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
204b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
204c0 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
204d0 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
204e0 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  n, p->nOut);.#if
204f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20500 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20  E_TREE_EXPLAIN. 
20510 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31 30 30   /* If the 0x100
20520 20 62 69 74 20 6f 66 20 77 68 65 72 65 74 72 61   bit of wheretra
20530 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65  cing is set, the
20540 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68  n show all of th
20550 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  e constraint.  *
20560 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
20570 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61   the WhereLoop.a
20580 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20  LTerm[] array.. 
20590 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54   */.  if( p->nLT
205a0 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
205b0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
205c0 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45  0)!=0 ){  /* WHE
205d0 52 45 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f  RETRACE 0x100 */
205e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
205f0 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f  Vdbe *v = pWInfo
20600 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  ->pParse->pVdbe;
20610 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
20620 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20  ainBegin(v);.   
20630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
20640 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
20650 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
20660 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b  erm = p->aLTerm[
20670 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  i];.      if( pT
20680 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
20690 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
206a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c  ExplainPrintf(v,
206b0 20 22 20 20 28 25 64 29 20 23 25 2d 32 64 20 22   "  (%d) #%-2d "
206c0 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65  , i+1, (int)(pTe
206d0 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20  rm-pWC->a));.   
206e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
206f0 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20  nPush(v);.      
20700 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
20710 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  (v, pTerm);.    
20720 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
20730 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71  Pop(v);.      sq
20740 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76  lite3ExplainNL(v
20750 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
20760 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73  ite3ExplainFinis
20770 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  h(v);.    sqlite
20780 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
20790 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ", sqlite3VdbeEx
207a0 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20  planation(v));. 
207b0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64   }.#endif.}.#end
207c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
207d0 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e  t bulk memory in
207e0 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65  to a valid Where
207f0 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65  Loop that can be
20800 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68   passed.** to wh
20810 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72  ereLoopClear har
20820 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74  mlessly..*/.stat
20830 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
20840 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20  pInit(WhereLoop 
20850 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  *p){.  p->aLTerm
20860 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63   = p->aLTermSpac
20870 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d  e;.  p->nLTerm =
20880 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20   0;.  p->nLSlot 
20890 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  = ArraySize(p->a
208a0 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70  LTermSpace);.  p
208b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d  ->wsFlags = 0;.}
208c0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
208d0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e  e WhereLoop.u un
208e0 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72  ion.  Leave Wher
208f0 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74  eLoop.pLTerm int
20900 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  act..*/.static v
20910 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
20920 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20  arUnion(sqlite3 
20930 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
20940 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46  p){.  if( p->wsF
20950 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49  lags & (WHERE_VI
20960 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45  RTUALTABLE|WHERE
20970 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a  _AUTO_INDEX) ){.
20980 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
20990 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
209a0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20  UALTABLE)!=0 && 
209b0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
209c0 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
209d0 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74  te3_free(p->u.vt
209e0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
209f0 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
20a00 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
20a10 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
20a20 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
20a30 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
20a40 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
20a50 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62  EX)!=0 && p->u.b
20a60 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
20a70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
20a80 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
20a90 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f  tree.pIndex->zCo
20aa0 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  lAff);.      sql
20ab0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
20ac0 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
20ad0 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ex->pKeyInfo);. 
20ae0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
20af0 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
20b00 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
20b10 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
20b20 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
20b30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
20b40 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
20b50 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
20b60 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
20b70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20b80 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
20b90 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
20ba0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
20bb0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
20bc0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
20bd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20be0 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
20bf0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
20c00 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
20c10 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
20c20 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
20c30 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
20c40 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
20c50 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
20c60 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
20c70 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
20c80 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
20c90 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
20ca0 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
20cb0 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
20cc0 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
20cd0 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
20ce0 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
20cf0 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
20d00 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
20d10 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
20d20 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
20d30 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
20d40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20d50 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
20d60 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
20d70 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
20d80 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
20d90 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
20da0 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
20db0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
20dc0 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
20dd0 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
20de0 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
20df0 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
20e00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20e10 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
20e20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
20e30 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
20e40 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
20e50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
20e60 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
20e70 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
20e80 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
20e90 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
20ea0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
20eb0 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
20ec0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
20ed0 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
20ee0 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
20ef0 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
20f00 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
20f10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
20f20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
20f30 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
20f40 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
20f50 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
20f60 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
20f70 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
20f80 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
20f90 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
20fa0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
20fb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20fc0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
20fd0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
20fe0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
20ff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
21000 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
21010 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
21020 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
21030 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
21040 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
21050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21060 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
21070 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
21080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21090 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
210a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
210b0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
210c0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
210d0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
210e0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
210f0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
21100 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
21110 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21120 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
21130 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
21140 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
21150 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
21160 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
21170 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
21180 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
21190 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
211a0 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
211b0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
211c0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
211d0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
211e0 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
211f0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
21200 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
21210 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21220 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
21230 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
21240 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
21250 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
21260 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
21270 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
21280 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
21290 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
212a0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
212b0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
212c0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
212d0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
212e0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
212f0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
21300 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
21310 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
21320 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
21330 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
21340 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
21350 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
21360 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
21370 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
21380 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
21390 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
213a0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
213b0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
213c0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
213d0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
213e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
213f0 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   we only care ab
21400 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
21410 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
21420 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
21430 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
21440 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
21450 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
21460 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
21470 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
21480 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
21490 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
214a0 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
214b0 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
214c0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
214d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
214e0 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
214f0 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
21500 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
21510 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
21520 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
21530 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
21540 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
21550 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
21560 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73  e.** template is
21570 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
21580 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
21590 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
215a0 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
215b0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
215c0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
215d0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
215e0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
215f0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
21600 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
21610 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
21620 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
21630 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
21640 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
21650 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
21660 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
21670 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
21680 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
21690 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
216a0 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20  .**    (5)  The 
216b0 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f  template uses mo
216c0 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
216d0 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68  same index but h
216e0 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c  as no additional
216f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70 65  .**         depe
21700 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20 20 20  ndencies        
21710 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
21720 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
21730 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
21740 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
21750 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
21760 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
21770 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70  **ppPrev, *p, *p
21780 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  Next = 0;.  Wher
21790 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
217a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
217b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
217c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
217d0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
217e0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
217f0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
21800 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
21810 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
21820 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
21830 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
21840 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
21850 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
21860 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
21870 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
21880 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
21890 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
218a0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
218b0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
218c0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
218d0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
218e0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
21910 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
21920 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
21930 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
21940 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
21950 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
21960 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21970 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
21980 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
21990 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
219a0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
219b0 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
219c0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
219d0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
219e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
219f0 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
21a00 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
21a10 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77  ereLoop to overw
21a20 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74  rite, or which t
21a30 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69  akes.  ** priori
21a40 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74  ty over pTemplat
21a50 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  e..  */.  for(pp
21a60 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c  Prev=&pWInfo->pL
21a70 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b  oops, p=*ppPrev;
21a80 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
21a90 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
21aa0 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
21ab0 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
21ac0 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
21ad0 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
21ae0 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20  ->iSortIdx ){.  
21af0 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
21b00 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f   the iTab or iSo
21b10 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72  rtIdx values for
21b20 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61   two WhereLoop a
21b30 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  re different.   
21b40 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65     ** then those
21b50 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64   WhereLoops need
21b60 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
21b70 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e  d separately.  N
21b80 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20  either is.      
21b90 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  ** a candidate t
21ba0 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74  o replace the ot
21bb0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f  her. */.      co
21bc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
21bd0 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72    /* In the curr
21be0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
21bf0 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76  on, the rSetup v
21c00 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a  alue is either z
21c10 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68  ero.    ** or th
21c20 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69  e cost of buildi
21c30 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
21c40 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e  index (NlogN) an
21c50 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20  d the NlogN.    
21c60 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66  ** is the same f
21c70 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68  or compatible Wh
21c80 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20  ereLoops. */.   
21c90 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
21ca0 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61  up==0 || pTempla
21cb0 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20  te->rSetup==0 . 
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  || p->rSetup==pT
21ce0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
21cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65  );..    /* where
21d00 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61  LoopAddBtree() a
21d10 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20  lways generates 
21d20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20  and inserts the 
21d30 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
21d40 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73      ** case firs
21d50 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74  t.  Hence compat
21d60 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57  ible candidate W
21d70 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20  hereLoops never 
21d80 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20  have a larger.  
21d90 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c    ** rSetup. Cal
21da0 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56  l this SETUP-INV
21db0 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73  ARIANT */.    as
21dc0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
21dd0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
21de0 75 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 28  up );..    if( (
21df0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
21e00 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
21e10 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  p->prereq.     &
21e20 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
21e30 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20  mplate->rSetup. 
21e40 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
21e50 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
21e60 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
21e70 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
21e80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
21e90 20 54 68 69 73 20 62 72 61 6e 63 68 20 74 61 6b   This branch tak
21ea0 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65 71 75  en when p is equ
21eb0 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61  al or better tha
21ec0 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a  n pTemplate in .
21ed0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20        ** all of 
21ee0 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73  (1) dependencies
21ef0 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c   (2) setup-cost,
21f00 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61   (3) run-cost, a
21f10 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 34 29 20  nd.      ** (4) 
21f20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
21f30 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
21f40 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
21f50 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
21f60 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66  etup );.      if
21f70 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65  ( p->prereq==pTe
21f80 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
21f90 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65        && p->nLTe
21fa0 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  rm<pTemplate->nL
21fb0 54 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28  Term.       && (
21fc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 70 54 65  p->wsFlags & pTe
21fd0 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
21fe0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
21ff0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
22000 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22010 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62  ==pTemplate->u.b
22020 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20  tree.pIndex.    
22030 20 20 20 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61        || pTempla
22040 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65  te->rRun+p->nLTe
22050 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d  rm<=p->rRun+pTem
22060 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20  plate->nLTerm). 
22070 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22080 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
22090 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
220a0 6f 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c  op with an simil
220b0 61 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73  ar one that uses
220c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65  .        ** more
220d0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
220e0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  dex */.        p
220f0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
22100 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  oop;.        bre
22110 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
22120 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d  .        /* pTem
22130 70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c  plate is not hel
22140 70 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a  pful..        **
22150 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
22160 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69  changing or addi
22170 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
22180 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
22190 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
221a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
221b0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
221c0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
221d0 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
221e0 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20  te->prereq.     
221f0 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d  && p->rRun>=pTem
22200 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20  plate->rRun.    
22210 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
22220 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20  mplate->nOut.   
22230 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65   ){.      /* Ove
22240 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
22250 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
22260 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65 3a 20  h a better one: 
22270 6f 6e 65 20 74 68 61 74 20 69 73 0a 20 20 20 20  one that is.    
22280 20 20 2a 2a 20 62 65 74 74 65 72 20 61 74 20 6f    ** better at o
22290 6e 65 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ne of (1) depend
222a0 65 6e 63 69 65 73 2c 20 28 32 29 20 73 65 74 75  encies, (2) setu
222b0 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d  p-cost, (3) run-
222c0 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72  cost.      ** or
222d0 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f   (4) number of o
222e0 75 74 70 75 74 20 72 6f 77 73 2c 20 61 6e 64 20  utput rows, and 
222f0 69 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61  is no worse in a
22300 6e 79 20 6f 66 20 74 68 6f 73 65 0a 20 20 20 20  ny of those.    
22310 20 20 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2e    ** categories.
22320 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
22330 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
22340 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
22350 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
22360 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
22370 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
22380 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
22390 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
223a0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
223b0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
223c0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
223d0 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
223e0 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
223f0 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
22400 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
22410 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
22420 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
22430 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
22440 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
22450 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
22460 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
22470 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71   0x8 */.  if( sq
22480 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
22490 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
224a0 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
224b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
224c0 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b  f("ins-del:  ");
224d0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
224e0 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65  Print(p, pBuilde
224f0 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  r->pWC);.    }. 
22500 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22510 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20  rintf("ins-new: 
22520 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
22530 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
22540 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
22550 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
22560 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
22570 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
22580 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
22590 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
225a0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
225b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
225c0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
225d0 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77  Init(p);.  }.  w
225e0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
225f0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
22600 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
22610 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
22620 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d  v = p;.  if( (p-
22630 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
22640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
22650 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
22660 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
22670 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
22680 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
22690 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
226a0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
226b0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
226c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
226d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
226e0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
226f0 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e  he insert is a n
22700 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f  o-op */.whereLoo
22710 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69  pInsert_noop:.#i
22720 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
22730 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
22740 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
22750 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
22760 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22770 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70  Printf("ins-noop
22780 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c  : ");.    whereL
22790 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
227a0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
227b0 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  C);.  }.#endif. 
227c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
227d0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  K;  .}../*.** Ad
227e0 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
227f0 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
22800 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
22810 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
22820 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
22830 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
22840 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
22850 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
22860 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
22870 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
22880 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
22890 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74  ation, the first
228a0 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
228b0 75 73 65 20 74 65 72 6d 20 72 65 64 75 63 65 73  use term reduces
228c0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
228d0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
228e0 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20   a factor of 10 
228f0 61 6e 64 20 65 61 63 68 20 61 64 64 69 74 69 6f  and each additio
22900 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75  nal term.** redu
22910 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
22920 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
22930 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61   sqrt(2)..*/.sta
22940 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
22950 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 57  opOutputAdjust(W
22960 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
22970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
22980 70 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  p){.  WhereTerm 
22990 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
229a0 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
229b0 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
229c0 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
229d0 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
229e0 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69  ;..  if( !Optimi
229f0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
22a00 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
22a10 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 41 64  e->db, SQLITE_Ad
22a20 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b 0a 20  justOutEst) ){. 
22a30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
22a40 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
22a50 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  m, pTerm=pWC->a;
22a60 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d   i>0; i--, pTerm
22a70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
22a80 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
22a90 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20  ERM_VIRTUAL)!=0 
22aa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
22ab0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
22ac0 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
22ad0 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69  Self)==0 ) conti
22ae0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
22af0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
22b00 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20   notAllowed)!=0 
22b10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22b20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54  for(j=pLoop->nLT
22b30 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
22b40 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c  ){.      pX = pL
22b50 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
22b60 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20        if( pX==0 
22b70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22b80 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20    if( pX==pTerm 
22b90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
22ba0 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d  f( pX->iParent>=
22bb0 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58  0 && (&pWC->a[pX
22bc0 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65  ->iParent])==pTe
22bd0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
22be0 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  }.    if( j<0 ) 
22bf0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
22c00 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
22c10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  .  }.}../*.** We
22c20 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
22c30 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
22c40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
22c50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
22c60 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54  dex pIndex..** T
22c70 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
22c80 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  more..**.** If p
22c90 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
22ca0 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
22cb0 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
22cc0 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
22cd0 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
22ce0 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
22cf0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
22d00 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
22d10 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
22d20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
22d30 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
22d40 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
22d50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22d60 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
22d70 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
22d80 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
22d90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
22da0 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
22db0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
22dc0 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
22dd0 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22df0 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
22e00 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
22e10 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
22e20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
22e30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
22e40 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
22e50 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
22e60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
22e70 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
22e80 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
22e90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22ea0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22eb0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
22ec0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
22ed0 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
22ee0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
22ef0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f10 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
22f20 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
22f30 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
22f40 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
22f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
22f60 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
22f70 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
22f80 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
22fb0 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
22fc0 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
22fd0 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
22fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
22ff0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
23000 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
23010 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
23020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
23030 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
23040 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
23050 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
23060 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
23070 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
23080 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
23090 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
230a0 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
230b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
230c0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
230d0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
230e0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
230f0 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
23100 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
23110 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
23120 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f  u.btree.nSkip */
23130 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
23140 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
23150 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
23160 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
23170 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
23180 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
23190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
231a0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
231b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
231c0 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
231f0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
23200 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
23210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
23220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23230 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67  rn code */.  Log
23240 45 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20  Est nRowEst;    
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23260 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20  Estimated index 
23270 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20  selectivity */. 
23280 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
23290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
232a0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
232b0 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
232c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
232d0 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
232e0 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
232f0 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
23300 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
23310 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
23320 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
23330 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
23340 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23350 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
23360 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
23370 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
23380 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23390 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
233a0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
233b0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
233c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
233d0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
233e0 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
233f0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
23400 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74  se if( pProbe->t
23410 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d  num<=0 || (pSrc-
23420 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
23430 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
23440 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
23450 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
23460 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
23470 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
23480 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
23490 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57  O_ISNULL|WO_GT|W
234a0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
234b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
234c0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
234d0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
234e0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
234f0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
23500 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
23510 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq<=pProbe->nKe
23520 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 70 4e  yCol );.  if( pN
23530 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
23540 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  < pProbe->nKeyCo
23550 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  l ){.    iCol = 
23560 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
23570 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
23580 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  Eq];.    nRowEst
23590 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
235a0 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73  (pProbe->aiRowEs
235b0 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  t[pNew->u.btree.
235c0 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28  nEq+1]);.    if(
235d0 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26 20 70   nRowEst==0 && p
235e0 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Probe->onError==
235f0 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73  OE_None ) nRowEs
23600 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 1;.  }else{.
23610 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20      iCol = -1;. 
23620 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a     nRowEst = 0;.
23630 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68    }.  pTerm = wh
23640 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
23650 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
23660 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
23670 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   iCol,.         
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
23690 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
236a0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
236b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
236c0 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
236d0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
236e0 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  Skip;.  saved_nL
236f0 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
23700 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
23710 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
23720 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
23730 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
23740 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
23750 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
23760 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
23770 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d   0;.  rLogSize =
23780 20 65 73 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c   estLog(sqlite3L
23790 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  ogEst(pProbe->ai
237a0 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 69  RowEst[0]));.  i
237b0 66 28 20 70 54 65 72 6d 3d 3d 30 0a 20 20 20 26  f( pTerm==0.   &
237c0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  & saved_nEq==sav
237d0 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
237e0 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
237f0 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
23800 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
23810 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 35  t[saved_nEq+1]>5
23820 30 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  0.  ){.    LogEs
23830 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
23840 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
23850 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
23860 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20  ree.nSkip++;.   
23870 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
23880 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
23890 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  0;.    pNew->wsF
238a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b  lags |= WHERE_SK
238b0 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65  IPSCAN;.    nIte
238c0 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  r = sqlite3LogEs
238d0 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  t(pProbe->aiRowE
238e0 73 74 5b 30 5d 2f 70 50 72 6f 62 65 2d 3e 61 69  st[0]/pProbe->ai
238f0 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  RowEst[saved_nEq
23900 2b 31 5d 29 3b 0a 20 20 20 20 77 68 65 72 65 4c  +1]);.    whereL
23910 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
23920 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
23930 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b   pProbe, nIter);
23940 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d  .  }.  for(; rc=
23950 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
23960 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
23970 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
23980 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e  can)){.    int n
23990 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
239a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
239b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
239c0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
239d0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
239e0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
239f0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
23a00 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
23a10 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
23a20 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
23a30 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
23a40 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
23a50 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
23a60 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
23a70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
23a80 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
23a90 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
23aa0 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
23ab0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
23ac0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
23ad0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
23ae0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
23af0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61 73 73 65  tinue;..    asse
23b00 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
23b10 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20  saved_nOut );.. 
23b20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
23b30 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
23b40 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
23b50 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
23b60 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
23b70 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
23b80 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
23b90 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
23ba0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
23bb0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
23bc0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
23bd0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
23be0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
23bf0 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
23c00 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
23c10 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
23c20 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
23c30 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
23c40 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
23c50 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73  rLogSize; /* Bas
23c60 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f  eline cost is lo
23c70 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65  g2(N).  Adjustme
23c80 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  nts below */.   
23c90 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
23ca0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
23cb0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
23cc0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
23cd0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
23ce0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
23cf0 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
23d00 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
23d10 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
23d20 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
23d30 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
23d40 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
23d50 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
23d60 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
23d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
23d80 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
23d90 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
23da0 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
23db0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
23dc0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
23dd0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
23de0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
23df0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
23e00 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
23e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
23e20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
23e30 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
23e40 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
23e50 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
23e60 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70   += nIn;.      p
23e70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
23e80 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
23e90 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
23ea0 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
23eb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
23ec0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
23ed0 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  (WO_EQ) ){.     
23ee0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
23ef0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
23f00 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
23f10 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
23f20 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b 49 50 53  N_IN|WHERE_SKIPS
23f30 43 41 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20  CAN))!=0.       
23f40 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20   || nInMul==0.  
23f50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 4e 65      );.      pNe
23f60 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
23f70 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
23f80 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
23f90 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72   .       || (pPr
23fa0 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
23fb0 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d  _None && nInMul=
23fc0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
23fd0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
23fe0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
23ff0 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  Col-1).      ){.
24000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24010 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
24020 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
24030 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29  )==0 || iCol<0 )
24040 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
24050 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
24060 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
24070 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
24080 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
24090 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
240a0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b  RowEst + nInMul;
240b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
240c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
240d0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  & (WO_ISNULL) ){
240e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
240f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
24100 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  LUMN_NULL;.     
24110 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24120 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Eq++;.      /* T
24130 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73  UNING: IS NULL s
24140 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f  elects 2 rows */
24150 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b  .      nIn = 10;
24160 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
24170 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
24180 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
24190 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e  ut = nRowEst + n
241a0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
241b0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
241c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
241d0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
241e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
241f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
24200 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
24210 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
24220 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24230 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _GE );.      pNe
24240 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
24250 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
24260 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  |WHERE_BTM_LIMIT
24270 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
24280 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
24290 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
242a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
242b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
242c0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
242d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
242e0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
242f0 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  tor & WO_LT );. 
24300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24310 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
24320 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
24330 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
24340 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
24350 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
24360 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
24370 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
24380 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
24390 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
243a0 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
243d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
243e0 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 0;.    }.    i
243f0 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
24400 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
24410 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
24420 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e  * Adjust nOut an
24430 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33  d rRun for STAT3
24440 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f   range values */
24450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24460 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
24470 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 77  _nOut );.      w
24480 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
24490 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
244a0 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
244b0 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  New);.    }.#ifd
244c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
244d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
244e0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
244f0 30 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f 62  0 .     && pProb
24500 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
24510 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
24520 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
24530 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 26  SampleCol.     &
24540 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
24550 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
24560 5f 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b 0a  _Stat3) .    ){.
24570 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
24580 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
24590 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
245a0 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
245b0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
245c0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
245d0 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b  O_ISNULL))!=0 ){
245e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
245f0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
24600 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
24610 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24620 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24630 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
24640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
24650 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
24660 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
24670 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
24680 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d   &nOut);.      }
24690 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
246a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
246b0 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN).            
246c0 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72 6f   &&  !ExprHasPro
246d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
246e0 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20  xIsSelect)  ){. 
246f0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
24700 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
24710 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
24720 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
24730 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
24740 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d     assert( nOut=
24750 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
24760 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
24770 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
24780 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
24790 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
247a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
247b0 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
247c0 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
247d0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
247e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
247f0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e  ndif.    if( (pN
24800 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  ew->wsFlags & (W
24810 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
24820 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a  ERE_IPK))==0 ){.
24830 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f        /* Each ro
24840 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65  w involves a ste
24850 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  p of the index, 
24860 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65  then a binary se
24870 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a  arch of.      **
24880 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
24890 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
248a0 52 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c 6f  Run =  sqlite3Lo
248b0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
248c0 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f  un,rLogSize>27 ?
248d0 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31   rLogSize-17 : 1
248e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
248f0 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65   Step cost for e
24900 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ach output row *
24910 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  /.    pNew->rRun
24920 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
24930 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
24940 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
24950 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
24960 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
24970 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20  >pWC, pNew);.   
24980 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
24990 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
249a0 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28  pNew);.    if( (
249b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
249c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
249d0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
249e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70  ->u.btree.nEq<(p
249f0 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 2b  Probe->nKeyCol +
24a00 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21   (pProbe->zName!
24a10 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0)).    ){.    
24a20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
24a30 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
24a40 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
24a50 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
24a60 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
24a70 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
24a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
24a90 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
24aa0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
24ab0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
24ac0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
24ad0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
24ae0 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
24af0 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
24b00 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
24b10 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
24b20 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76  tree.nSkip = sav
24b30 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
24b40 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
24b50 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
24b60 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
24b70 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
24b80 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
24b90 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
24ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24bb0 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
24bc0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
24bd0 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
24be0 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
24bf0 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
24c00 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
24c10 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
24c20 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
24c30 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
24c40 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
24c50 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
24c60 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
24c70 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
24c80 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
24c90 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
24ca0 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
24cb0 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
24cc0 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
24cd0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
24ce0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
24cf0 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
24d00 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
24d10 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
24d20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
24d30 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
24d40 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
24d50 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
24d60 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
24d70 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
24d80 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
24d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
24da0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
24db0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
24dc0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
24dd0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
24de0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
24df0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
24e00 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
24e10 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
24e20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
24e30 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
24e40 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  r ){.      for(j
24e50 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
24e60 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
24e70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
24e80 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
24e90 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
24ea0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
24eb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
24ec0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
24ee0 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
24ef0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
24f00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
24f10 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
24f20 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
24f30 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
24f40 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
24f50 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
24f60 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
24f70 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
24f80 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
24f90 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
24fa0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
24fb0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
24fc0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
24fd0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
24fe0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
24ff0 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
25000 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
25010 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
25020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
25030 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
25040 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
25050 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
25060 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25070 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
25080 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
25090 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
250a0 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
250b0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
250c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
250d0 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
250e0 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
250f0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
25100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25110 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
25120 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
25130 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
25140 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
25150 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
25160 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
25170 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
25180 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
25190 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
251a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
251b0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
251c0 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  xpr(pTerm->pExpr
251d0 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20  , pWhere, iTab) 
251e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
251f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
25200 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
25210 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
25220 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
25230 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
25240 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
25250 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
25260 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
25270 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
25280 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
25290 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
252a0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
252b0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
252c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
252d0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
252e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
252f0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
25300 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
25310 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
25320 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
25330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
25340 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
25350 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
25360 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
25370 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
25380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
25390 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
253a0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
253b0 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
253c0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
253d0 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
253e0 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
253f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25400 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
25410 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
25420 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
25430 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f  /.  tRowcnt aiRo
25440 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20  wEstPk[2];      
25450 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
25460 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
25470 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
25480 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
25490 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
254a0 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
254b0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
254c0 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
254d0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
254e0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
254f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
25500 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
25510 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
25520 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
25530 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
25540 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
25550 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
25560 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
25570 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
25580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25590 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
255a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
255b0 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
255c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
255d0 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
255e0 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25600 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
25610 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
25620 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
25630 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
25640 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
25650 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
25660 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
25670 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
25680 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
25690 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
256a0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
256b0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
256c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
256d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
256e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25700 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
25710 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
25720 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
25730 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
25740 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25750 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
25760 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
25770 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
25780 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
25790 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
257a0 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
257b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
257c0 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
257d0 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
257e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
257f0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
25800 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
25810 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
25820 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
25830 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
25840 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
25850 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
25860 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
25870 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f  Tab) ){.    pPro
25880 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  be = pTab->pInde
25890 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
258a0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
258b0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
258c0 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
258d0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
258e0 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
258f0 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
25900 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
25910 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
25920 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
25930 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
25940 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
25950 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
25960 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
25970 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
25980 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
25990 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
259a0 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259c0 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
259d0 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
259e0 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
259f0 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
25a00 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
25a10 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20  k.nKeyCol = 1;. 
25a20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
25a30 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
25a40 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
25a50 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
25a60 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
25a70 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
25a80 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61  sPk.pTable = pTa
25a90 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
25aa0 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  k[0] = pTab->nRo
25ab0 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
25ac0 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
25ad0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
25ae0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
25af0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
25b00 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
25b10 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
25b20 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
25b30 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
25b40 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
25b50 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
25b60 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
25b70 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
25b80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
25b90 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
25ba0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
25bb0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
25bc0 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
25bd0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
25be0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
25bf0 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
25c00 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
25c10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25c20 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
25c30 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
25c40 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
25c50 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
25c60 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  et.   && (pWInfo
25c70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
25c80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
25c90 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
25ca0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
25cb0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69  .   && !pSrc->vi
25cc0 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26  aCoroutine.   &&
25cd0 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   !pSrc->notIndex
25ce0 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69  ed.   && HasRowi
25cf0 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70  d(pTab).   && !p
25d00 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
25d10 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  d.  ){.    /* Ge
25d20 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
25d30 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
25d40 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
25d50 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
25d60 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
25d70 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
25d80 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
25d90 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
25da0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
25db0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
25dc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
25dd0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
25de0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
25df0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25e00 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
25e10 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
25e20 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
25e30 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
25e40 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
25e50 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
25e60 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
25e70 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
25e80 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
25e90 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
25ea0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
25eb0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
25ec0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
25ed0 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
25ee0 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
25ef0 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
25f00 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
25f10 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69        ** approxi
25f20 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28  mately 7*N*log2(
25f30 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
25f40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
25f50 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
25f60 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
25f70 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ndexed. */.     
25f80 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
25f90 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
25fa0 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74  ze + 28;  assert
25fb0 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 28==sqlite3Log
25fc0 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  Est(7) );.      
25fd0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
25fe0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
25ff0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
26000 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
26010 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
26020 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
26030 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
26040 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
26050 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
26060 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
26070 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
26080 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
26090 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
260a0 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
260b0 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
260c0 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
260d0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
260e0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
260f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
26100 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
26110 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
26120 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
26130 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
26140 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
26150 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
26160 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
26170 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
26180 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
26190 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
261a0 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
261b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
261c0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
261d0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
261e0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
261f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
26200 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26210 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
26220 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
26230 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
26240 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
26250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26260 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
26270 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
26280 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
26290 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
262a0 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
262b0 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
262c0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
262d0 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
262e0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
262f0 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
26300 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
26310 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
26320 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
26330 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
26340 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
26350 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
26360 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
26370 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
26380 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
26390 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
263a0 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
263b0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
263c0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
263d0 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
263e0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
263f0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
26400 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
26410 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
26420 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
26430 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
26440 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
26450 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
26460 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
26470 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
26480 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
26490 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
264a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
264b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
264c0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
264d0 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
264e0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
264f0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
26500 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
26510 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
26520 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
26530 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
26540 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
26550 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
26560 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
26570 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
26580 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
26590 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
265a0 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
265b0 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20  le scan is 3*(N 
265c0 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20  + log2(N))..    
265d0 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
265e0 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74  ra 3 factor is t
265f0 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
26600 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c  use of indexed l
26610 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20  ookups.      ** 
26620 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63      over full sc
26630 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20  ans.  FIXME */. 
26640 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
26650 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26660 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
26670 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77  e) + 16;.      w
26680 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
26690 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b  just(pWC, pNew);
266a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
266b0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
266c0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
266d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
266e0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
266f0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
26700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
26710 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
26720 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
26730 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
26740 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
26750 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
26760 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
26770 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
26780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26790 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
267a0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
267b0 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
267c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
267d0 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
267e0 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
267f0 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
26800 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
26810 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
26820 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
26830 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
26840 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
26850 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
26860 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d  ).       || ( m=
26870 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
26880 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
26890 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
268a0 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52   (pProbe->szIdxR
268b0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
268c0 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  w).         && (
268d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
268e0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
268f0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
26900 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
26910 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
26920 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
26930 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
26940 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
26950 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
26960 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
26970 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
26980 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
26990 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
269a0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
269b0 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30          if( m==0
269c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
269d0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
269e0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
269f0 78 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b  x scan is K*(N +
26a00 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
26a10 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
26a20 65 78 74 72 61 20 66 61 63 74 6f 72 20 4b 20 6f  extra factor K o
26a30 66 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  f between 1.1 an
26a40 64 20 33 2e 30 20 74 68 61 74 20 64 65 70 65 6e  d 3.0 that depen
26a50 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
26a60 20 20 20 20 6f 6e 20 74 68 65 20 72 65 6c 61 74      on the relat
26a70 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
26a80 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 69   table and the i
26a90 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20 20 20 20  ndex.  K.       
26aa0 20 20 20 2a 2a 20 20 20 20 20 69 73 20 73 6d 61     **     is sma
26ab0 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72  ller for smaller
26ac0 20 69 6e 64 69 63 65 73 2c 20 74 68 75 73 20 66   indices, thus f
26ad0 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20  avoring them..  
26ae0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26af0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
26b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26b10 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
26b20 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
26b50 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
26b60 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  abRow;.        }
26b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26b80 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
26b90 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
26ba0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
26bb0 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
26bc0 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
26bd0 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
26be0 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
26bf0 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
26c00 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
26c10 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
26c20 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
26c30 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
26c40 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
26c50 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
26c60 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
26c70 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
26c80 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
26c90 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
26ca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26cb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
26cc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
26cd0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
26ce0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
26cf0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
26d00 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
26d10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
26d20 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
26d30 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
26d40 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
26d50 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
26d60 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
26d70 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
26d80 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
26d90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
26da0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
26db0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
26dc0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
26dd0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
26de0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
26df0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
26e00 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
26e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
26e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26e30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
26e40 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
26e50 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
26e60 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
26e70 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
26e80 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
26e90 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
26ea0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
26eb0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
26ec0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
26ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
26ee0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
26ef0 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
26f00 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
26f10 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
26f20 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
26f30 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
26f40 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  a.){.  WhereInfo
26f50 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
26f60 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
26f70 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
26f80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26fa0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
26fb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26fc0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
26fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26fe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
26ff0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27000 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
27010 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
27020 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
27030 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
27040 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
27050 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
27060 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
27070 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
27080 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
27090 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
270a0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
270b0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
270c0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
270d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
270e0 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
270f0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
27100 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
27110 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
27120 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
27130 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27140 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
27150 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
27160 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
27170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27180 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
27190 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
271a0 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
271b0 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
271c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
271d0 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
271e0 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
271f0 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
27200 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
27210 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27220 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
27230 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
27240 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
27250 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
27260 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
27270 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
27280 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
27290 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
272a0 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
272b0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
272c0 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
272d0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
272e0 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
272f0 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
27300 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
27310 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
27320 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
27330 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
27340 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
27350 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
27360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27370 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
27380 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
27390 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
273a0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
273b0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
273c0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
273d0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
273e0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
273f0 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
27400 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
27410 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
27420 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
27430 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
27440 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
27450 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
27460 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
27470 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27480 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
27490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
274a0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
274b0 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
274c0 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
274d0 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
274e0 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
274f0 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
27500 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
27510 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
27520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
27530 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
27540 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
27550 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
27560 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
27570 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
27580 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
27590 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
275a0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
275b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
275c0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
275d0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
275e0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
275f0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
27600 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
27610 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
27620 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
27630 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
27640 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
27650 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
27660 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
27670 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
27680 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
27690 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
276a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
276b0 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
276c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
276d0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
276e0 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
276f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
27700 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
27710 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27720 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27730 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
27740 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
27750 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
27760 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
27770 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
27780 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
27790 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
277a0 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
277b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
277c0 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
277d0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
277e0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
277f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27800 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
27810 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
27820 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
27830 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
27840 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
27850 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
27860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
27870 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
27880 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27890 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
278a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
278b0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
278c0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
278d0 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
278e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
278f0 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
27900 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
27910 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
27920 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
27930 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
27940 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
27950 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
27960 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
27970 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
27980 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
27990 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
279a0 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
279b0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
279c0 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
279d0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
279e0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
279f0 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
27a00 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
27a10 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
27a20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
27a30 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
27a40 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
27a50 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
27a60 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
27a70 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70  (double)2;.    p
27a80 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
27a90 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20  edRows = 25;.   
27aa0 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
27ab0 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
27ac0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
27ad0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
27ae0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
27af0 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
27b00 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
27b10 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
27b20 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
27b30 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
27b40 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
27b50 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
27b60 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20  mxTerm = -1;.   
27b70 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
27b80 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
27b90 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt );.    for(i=
27ba0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
27bb0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
27bc0 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
27bd0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
27be0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
27bf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
27c00 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
27c10 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cons++){.      i
27c20 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
27c30 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
27c40 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
27c50 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
27c60 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
27c70 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
27c80 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
27c90 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
27ca0 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
27cb0 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
27cc0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
27cd0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
27ce0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
27cf0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
27d00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
27d10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d20 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
27d30 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
27d40 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
27d50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27d60 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
27d70 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
27d80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27d90 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
27da0 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
27db0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
27dc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
27dd0 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
27de0 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
27df0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
27e00 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
27e10 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
27e20 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27e30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27e40 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
27e50 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
27e60 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
27e70 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
27e80 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
27e90 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
27ea0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
27eb0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
27ec0 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =15 );.        t
27ed0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
27ee0 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16 );.        if
27ef0 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
27f00 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
27f10 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
27f20 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
27f30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
27f40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27f50 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
27f60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
27f70 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
27f80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
27f90 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
27fa0 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
27fb0 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
27fc0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
27fd0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
27fe0 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
27ff0 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
28000 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
28010 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
28020 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
28030 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
28040 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
28050 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
28060 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
28070 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
28080 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
28090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
280a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
280b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
280c0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
280d0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
280e0 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
280f0 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
28100 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
28110 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
28120 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
28130 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
28140 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
28150 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
28160 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
28170 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
28180 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
28190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
281a0 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
281b0 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
281c0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
281d0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
281e0 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
281f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
28200 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
28210 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
28220 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28230 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
28240 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
28250 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
28260 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
28270 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
28280 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
28290 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
282a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
282b0 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
282c0 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65  dxNum;.      pNe
282d0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
282e0 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ee = pIdxInfo->n
282f0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b  eedToFreeIdxStr;
28300 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
28310 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28320 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  r = 0;.      pNe
28330 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
28340 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
28350 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Str;.      pNew-
28360 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
28370 64 20 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e  d = (u8)((pIdxIn
28380 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29  fo->nOrderBy!=0)
28390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66        && pIdxInf
283c0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
283d0 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ed);.      pNew-
283e0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
283f0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
28400 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
28410 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
28420 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
28430 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
28440 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
28450 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  st(pIdxInfo->est
28460 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20  imatedRows);.   
28470 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65     whereLoopInse
28480 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
28490 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  w);.      if( pN
284a0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
284b0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ree ){.        s
284c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
284d0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
284e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
284f0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
28500 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
28510 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c   }.  }  ..whereL
28520 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a  oopAddVtab_exit:
28530 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
28540 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28550 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
28560 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
28570 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
28580 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
28590 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
285a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
285b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
285c0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
285d0 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  dd WhereLoop ent
285e0 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f  ries to handle O
285f0 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77  R terms.  This w
28600 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a  orks for either.
28610 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72  ** btrees or vir
28620 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
28630 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
28640 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c  LoopAddOr(WhereL
28650 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
28660 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45  lder, Bitmask mE
28670 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e  xtra){.  WhereIn
28680 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
28690 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
286a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
286b0 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  C;.  WhereLoop *
286c0 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72  pNew;.  WhereTer
286d0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e  m *pTerm, *pWCEn
286e0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
286f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
28700 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
28710 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65  se tempWC;.  Whe
28720 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53  reLoopBuilder sS
28730 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65  ubBuild;.  Where
28740 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72  OrSet sSum, sCur
28750 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63  , sPrev;.  struc
28760 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28770 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20  pItem;.  .  pWC 
28780 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
28790 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
287a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
287b0 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74  E_AND_ONLY ) ret
287c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
287d0 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
287e0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
287f0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
28800 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
28810 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
28820 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
28830 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
28840 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
28850 69 54 61 62 3b 0a 20 20 69 66 28 20 21 48 61 73  iTab;.  if( !Has
28860 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61  Rowid(pItem->pTa
28870 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
28880 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d 20  TE_OK;.  iCur = 
28890 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
288a0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
288b0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
288c0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
288d0 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
288e0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
288f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
28900 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
28910 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
28920 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
28930 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
28940 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
28950 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
28960 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
28970 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
28980 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
28990 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
289a0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
289b0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
289c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
289d0 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
289e0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
289f0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
28a00 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
28a10 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
28a20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
28a30 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
28a40 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
28a50 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
28a60 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
28a70 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
28a80 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
28a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28aa0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
28ab0 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
28ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
28ad0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
28ae0 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
28af0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
28b00 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
28b10 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
28b20 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
28b30 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
28b40 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
28b50 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
28b60 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
28b70 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
28b80 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
28b90 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
28ba0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
28bb0 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
28bc0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
28bd0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
28be0 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
28bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28c00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
28c20 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  r.n = 0;.#ifndef
28c30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
28c40 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
28c50 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
28c60 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
28c70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
28c80 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
28c90 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  al(&sSubBuild, m
28ca0 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
28cb0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
28cc0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
28cd0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
28ce0 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
28cf0 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
28d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28d10 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
28d20 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
28d30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
28d40 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
28d50 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
28d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
28d70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
28d80 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
28d90 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
28da0 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
28db0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
28dc0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
28dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28de0 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50   whereOrMove(&sP
28df0 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20  rev, &sSum);.   
28e00 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
28e10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
28e20 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b  (i=0; i<sPrev.n;
28e30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
28e40 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43     for(j=0; j<sC
28e50 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ur.n; j++){.    
28e60 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
28e70 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73  rInsert(&sSum, s
28e80 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71  Prev.a[i].prereq
28e90 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65   | sCur.a[j].pre
28ea0 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
28ed0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
28ee0 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
28ef0 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
28f20 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
28f30 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
28f40 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
28f50 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
28f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28f70 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
28f80 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
28f90 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
28fa0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
28fb0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
28fc0 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
28fd0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
28fe0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
28ff0 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
29000 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
29010 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
29020 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
29030 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
29040 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
29050 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
29060 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75     /* TUNING: Mu
29070 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f  ltiple by 3.5 fo
29080 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20  r the secondary 
29090 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  table lookup */.
290a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
290b0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
290c0 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20  Run + 18;.      
290d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
290e0 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
290f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
29100 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
29110 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
29120 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29130 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29140 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
29150 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
29170 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
29180 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
29190 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
291a0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
291b0 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
291c0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
291d0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
291e0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
291f0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
29200 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
29210 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
29220 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
29230 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
29240 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
29250 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
29260 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29270 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
29280 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
29290 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
292a0 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
292b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
292c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
292d0 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
292e0 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
292f0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
29300 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
29310 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
29320 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
29330 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
29340 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
29350 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
29360 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
29370 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
29380 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
29390 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
293a0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
293b0 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
293c0 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
293d0 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
293e0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
293f0 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
29400 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
29410 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
29420 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
29430 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
29440 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
29450 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
29460 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
29470 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
29480 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
29490 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
294a0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
294b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
294c0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
294d0 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
294e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
294f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
29500 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
29510 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
29520 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
29530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29540 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
29550 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20  AddOr(pBuilder, 
29560 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
29570 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
29580 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
29590 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
295a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
295b0 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65  eak;.  }.  where
295c0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e  LoopClear(db, pN
295d0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ew);.  return rc
295e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
295f0 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
29600 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
29610 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
29620 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
29630 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  5th.** parameter
29640 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
29650 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
29660 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
29670 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
29680 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
29690 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
296a0 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74  rate sort operat
296b0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a  ion.  Return:.**
296c0 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45   .**    0:  ORDE
296d0 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69  R BY is not sati
296e0 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20  sfied.  Sorting 
296f0 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31  required.**    1
29700 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 73  :  ORDER BY is s
29710 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f  atisfied.      O
29720 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20  mit sorting.**  
29730 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74   -1:  Unknown at
29740 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   this time.**.**
29750 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
29760 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
29770 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
29780 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
29790 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
297a0 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
297b0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
297c0 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
297d0 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
297e0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
297f0 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
29800 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
29810 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
29820 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
29830 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  NT do not requir
29840 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
29850 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
29860 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
29870 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e  .** as equivelen
29880 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
29890 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
298a0 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
298b0 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
298c0 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
298d0 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
298e0 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
298f0 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
29900 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
29910 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
29920 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
29930 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
29940 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
29950 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61 74  int wherePathSat
29960 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
29970 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
29980 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
29990 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
299a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
299b0 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
299c0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
299d0 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
299e0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
299f0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
29a00 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
29a10 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
29a20 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
29a30 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67  gs,       /* Mig
29a40 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ht contain WHERE
29a50 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52  _GROUPBY or WHER
29a60 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a  E_DISTINCTBY */.
29a70 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20    u16 nLoop,    
29a80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29a90 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
29aa0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
29ab0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
29ac0 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64  Last,     /* Add
29ad0 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
29ae0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50  to the end of pP
29af0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
29b00 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d    Bitmask *pRevM
29b10 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  ask     /* OUT: 
29b20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f  Mask of WhereLoo
29b30 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76  ps to run in rev
29b40 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b  erse order */.){
29b50 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20  .  u8 revSet;   
29b60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29b70 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e   if rev is known
29b80 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20   */.  u8 rev;   
29b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
29ba0 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72  omposite sort or
29bb0 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49  der */.  u8 revI
29bc0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
29bd0 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64  * Index sort ord
29be0 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  er */.  u8 isOrd
29bf0 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a  erDistinct;   /*
29c00 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65   All prior Where
29c10 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d  Loops are order-
29c20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38  distinct */.  u8
29c30 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
29c40 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
29c50 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51  he loop has UNIQ
29c60 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  UE NOT NULL colu
29c70 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61  mns */.  u8 isMa
29c80 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tch;           /
29c90 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65  * iColumn matche
29ca0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
29cb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29cc0 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c  */.  u16 nKeyCol
29cd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
29ce0 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
29cf0 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
29d00 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
29d10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
29d20 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  l number of orde
29d30 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  red columns in t
29d40 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31  he index */.  u1
29d50 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  6 nOrderBy;     
29d60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65      /* Number te
29d70 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
29d80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
29d90 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
29da0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
29db0 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70  f WhereLoop in p
29dc0 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65  Path being proce
29dd0 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ssed */.  int i,
29de0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
29df0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
29e00 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
29e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
29e20 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
29e30 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
29e40 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  op */.  int iCol
29e50 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
29e60 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   A column number
29e70 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43   within table iC
29e80 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ur */.  WhereLoo
29e90 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a  p *pLoop = 0; /*
29ea0 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
29eb0 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  op being process
29ec0 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ed. */.  WhereTe
29ed0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f  rm *pTerm;     /
29ee0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
29ef0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
29f00 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
29f10 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f  OBExpr;        /
29f20 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
29f30 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
29f40 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f  Y clause */.  Co
29f50 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
29f60 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66      /* COLLATE f
29f70 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20  unction from an 
29f80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29f90 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  term */.  Index 
29fa0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
29fb0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73  /* The index ass
29fc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f  ociated with pLo
29fd0 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  op */.  sqlite3 
29fe0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
29ff0 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
2a000 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a010 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  n */.  Bitmask o
2a020 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  bSat = 0;    /* 
2a030 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59  Mask of ORDER BY
2a040 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
2a050 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74   so far */.  Bit
2a060 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20  mask obDone;    
2a070 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
2a080 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
2a090 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72   */.  Bitmask or
2a0a0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b  derDistinctMask;
2a0b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2a0c0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f   well-ordered lo
2a0d0 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ops */.  Bitmask
2a0e0 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20   ready;         
2a0f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2a100 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a  inner loops */..
2a110 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
2a120 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2a130 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
2a140 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
2a150 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
2a160 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
2a170 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
2a180 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
2a190 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2a1a0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
2a1b0 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
2a1c0 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
2a1d0 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
2a1e0 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
2a1f0 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
2a200 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
2a210 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
2a220 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
2a230 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
2a240 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
2a250 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
2a260 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
2a270 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
2a280 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
2a290 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
2a2a0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2a2b0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2a2c0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
2a2d0 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
2a2e0 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
2a2f0 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
2a300 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
2a310 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2a320 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
2a330 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
2a340 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
2a350 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
2a360 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
2a370 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
2a380 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2a390 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
2a3a0 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
2a3b0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2a3c0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
2a3d0 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
2a3e0 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
2a3f0 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
2a400 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
2a410 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
2a420 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
2a430 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
2a440 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
2a450 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
2a460 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
2a470 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
2a480 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
2a490 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
2a4a0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2a4b0 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
2a4c0 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
2a4d0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
2a4e0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2a4f0 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
2a500 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
2a510 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
2a520 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2a530 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
2a540 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
2a550 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
2a560 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2a570 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2a580 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
2a590 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2a5a0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2a5b0 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
2a5c0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a  pOrderBy!=0 );..
2a5d0 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79    /* Sortability
2a5e0 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
2a5f0 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  es is determined
2a600 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
2a610 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f  ex method.  ** o
2a620 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2a630 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  ble itself */.  
2a640 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61  if( pLast->wsFla
2a650 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2a660 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74  ALTABLE ){.    t
2a670 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30  estcase( nLoop>0
2a680 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65   );  /* True whe
2a690 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72  n outer loops ar
2a6a0 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61  e one-row and ma
2a6b0 74 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20  tch .           
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a6d0 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65  * no ORDER BY te
2a6e0 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rms */.    retur
2a6f0 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e  n pLast->u.vtab.
2a700 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20  isOrdered;.  }. 
2a710 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
2a720 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2a730 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
2a740 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
2a750 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
2a760 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
2a770 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63  ->nExpr;.  testc
2a780 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42  ase( nOrderBy==B
2a790 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f  MS-1 );.  if( nO
2a7a0 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72  rderBy>BMS-1 ) r
2a7b0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
2a7c0 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65  not optimize ove
2a7d0 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20  rly large ORDER 
2a7e0 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72  BYs */.  isOrder
2a7f0 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2a800 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54  obDone = MASKBIT
2a810 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20  (nOrderBy)-1;.  
2a820 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2a830 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d  k = 0;.  ready =
2a840 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   0;.  for(iLoop=
2a850 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  0; isOrderDistin
2a860 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f  ct && obSat<obDo
2a870 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f  ne && iLoop<=nLo
2a880 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2a890 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20    if( iLoop>0 ) 
2a8a0 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  ready |= pLoop->
2a8b0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c  maskSelf;.    pL
2a8c0 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  oop = iLoop<nLoo
2a8d0 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p ? pPath->aLoop
2a8e0 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b  [iLoop] : pLast;
2a8f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
2a900 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2a910 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2a920 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75  E)==0 );.    iCu
2a930 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
2a940 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
2a950 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20  Tab].iCursor;.. 
2a960 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
2a970 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ny ORDER BY term
2a980 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c   X that is a col
2a990 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
2a9a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
2a9b0 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20  urrent loop for 
2a9c0 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74  which there is t
2a9d0 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
2a9e0 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f  .    ** clause o
2a9f0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20  f the form X IS 
2aa00 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74  NULL or X=? that
2aa10 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
2aa20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  outer.    ** loo
2aa30 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ps..    */.    f
2aa40 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
2aa50 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2aa60 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2aa70 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2aa80 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72  e;.      pOBExpr
2aa90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2aaa0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
2aab0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2aac0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2aad0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
2aae0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
2aaf0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2ab00 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
2ab10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ab20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
2ab30 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69  (&pWInfo->sWC, i
2ab40 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43  Cur, pOBExpr->iC
2ab50 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72                ~r
2ab70 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
2ab80 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20  SNULL, 0);.     
2ab90 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
2aba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2abb0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2abc0 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
2abd0 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
2abe0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
2abf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
2ac00 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
2ac10 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2ac20 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2ac30 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
2ac40 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2ac50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2ac60 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2ac70 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2ac80 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
2ac90 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2aca0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2acb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2acc0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
2acd0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2ace0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2acf0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2ad00 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
2ad10 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
2ad20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2ad30 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
2ad40 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
2ad50 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2ad60 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2ad70 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
2ad80 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2ad90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2ada0 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
2adb0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2adc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
2add0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
2ade0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
2adf0 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
2ae00 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
2ae10 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2ae20 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
2ae30 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2ae40 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
2ae50 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
2ae60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2ae70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ae80 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
2ae90 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
2aea0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2aeb0 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
2aec0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
2aed0 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
2aee0 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
2aef0 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
2af00 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
2af10 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
2af20 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
2af30 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52  ]==(-1) || !HasR
2af40 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
2af50 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ble));.        i
2af60 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2af70 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
2af80 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20  !=OE_None;.     
2af90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
2afa0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
2afb0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
2afc0 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
2afd0 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
2afe0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2aff0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
2b000 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
2b010 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
2b020 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
2b030 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2b040 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
2b050 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
2b060 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
2b070 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
2b080 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
2b090 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
2b0a0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
2b0b0 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
2b0c0 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
2b0d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
2b0e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2b0f0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2b100 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
2b110 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
2b120 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2b130 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2b140 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2b150 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
2b160 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b170 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
2b180 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2b190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2b1a0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2b1c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2b1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b1e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2b1f0 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
2b200 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
2b210 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
2b220 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
2b230 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
2b240 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
2b250 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
2b260 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
2b270 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2b280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2b290 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
2b2a0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2b2b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
2b2c0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
2b2d0 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
2b2e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
2b2f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2b300 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
2b310 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
2b320 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2b330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b340 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2b350 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
2b360 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
2b370 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2b380 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
2b390 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
2b3a0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
2b3b0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
2b3c0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
2b3d0 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
2b3e0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
2b3f0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
2b400 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
2b410 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
2b420 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
2b430 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
2b440 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
2b450 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2b460 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
2b470 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
2b480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
2b490 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2b4a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2b4b0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
2b4c0 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
2b4d0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
2b4e0 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
2b4f0 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
2b500 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2b510 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
2b520 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
2b530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b540 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20      bOnce = 1;. 
2b550 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2b560 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
2b570 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c  i=0; bOnce && i<
2b580 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2b590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41            if( MA
2b5a0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2b5b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b5c0 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d         pOBExpr =
2b5d0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2b5e0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2b5f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2b600 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b610 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
2b620 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
2b630 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b640 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
2b650 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2b660 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
2b670 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2b680 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59  & (WHERE_GROUPBY
2b690 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42  |WHERE_DISTINCTB
2b6a0 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d  Y))==0 ) bOnce =
2b6b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2b6c0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2b6d0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2b6e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2b6f0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
2b700 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
2b710 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2b720 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  f( pOBExpr->iCol
2b730 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63  umn!=iColumn ) c
2b740 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2b750 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
2b760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b770 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2b780 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2b790 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2b7a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2b7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2b7c0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2b7d0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2b7e0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
2b7f0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2b800 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
2b810 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
2b820 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
2b830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b840 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2b850 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2b860 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2b870 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
2b880 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
2b890 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
2b8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2b8b0 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
2b8c0 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
2b8d0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
2b8e0 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
2b8f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b900 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2b910 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
2b920 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
2b930 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b940 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20  ERE_GROUPBY)==0 
2b950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2b960 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
2b970 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f  sort order is co
2b980 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f  mpatible in an O
2b990 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53              ** S
2b9b0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72  ort order is irr
2b9c0 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52  elevant for a GR
2b9d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a  OUP BY clause. *
2b9e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2b9f0 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
2ba00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
2ba10 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
2ba20 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
2ba30 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
2ba40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
2ba50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ba60 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
2ba70 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
2ba80 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
2ba90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2baa0 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
2bab0 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
2bac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bad0 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
2bae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2baf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2bb00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2bb10 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
2bb20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2bb30 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
2bb40 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
2bb50 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2bb60 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
2bb70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2bb80 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2bb90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2bba0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2bbb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bbc0 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
2bbd0 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
2bbe0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
2bbf0 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
2bc00 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
2bc10 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2bc20 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
2bc30 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2bc40 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
2bc50 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
2bc60 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
2bc70 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
2bc80 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
2bc90 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
2bca0 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
2bcb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
2bcc0 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
2bcd0 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
2bce0 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
2bcf0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2bd00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2bd10 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2bd20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
2bd30 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2bd40 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2bd50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2bd60 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
2bd70 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
2bd80 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65    if( (exprTable
2bd90 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
2bda0 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64  MaskSet, p)&~ord
2bdb0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
2bdc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2bdd0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2bde0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
2bdf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2be00 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
2be10 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
2be20 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
2be30 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
2be40 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
2be50 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
2be60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2be70 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
2be80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
2be90 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69  return -1;.}..#i
2bea0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2beb0 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
2bec0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2bed0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
2bee0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
2bef0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
2bf00 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
2bf10 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
2bf20 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
2bf30 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
2bf40 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2bf50 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
2bf60 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
2bf70 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
2bf80 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
2bf90 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
2bfa0 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
2bfb0 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
2bfc0 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
2bfd0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69  endif.../*.** Gi
2bfe0 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
2bff0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2c000 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
2c010 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
2c020 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
2c030 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
2c040 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
2c050 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
2c060 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
2c070 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
2c080 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
2c090 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
2c0a0 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
2c0b0 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
2c0c0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2c0d0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
2c0e0 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
2c0f0 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
2c100 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
2c110 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
2c120 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
2c130 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
2c140 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
2c150 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
2c160 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2c170 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
2c180 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
2c190 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2c1a0 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
2c1b0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
2c1c0 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
2c1d0 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
2c1e0 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
2c1f0 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
2c200 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
2c210 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
2c220 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
2c230 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
2c240 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
2c250 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2c260 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2c270 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
2c280 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
2c290 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
2c2a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
2c2b0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
2c2c0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2c2d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2c2e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2c2f0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2c300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2c310 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
2c320 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
2c330 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
2c340 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
2c350 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2c360 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2c370 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
2c380 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2c390 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
2c3a0 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f 67  replace */.  Log
2c3b0 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  Est rCost;      
2c3c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
2c3d0 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f  f a path */.  Lo
2c3e0 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20  gEst nOut;      
2c3f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c400 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a  r of outputs */.
2c410 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
2c420 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
2c430 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
2c440 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
2c450 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20  .  LogEst mxOut 
2c460 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
2c470 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c  Maximum nOut val
2c480 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66  ue on the set of
2c490 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
2c4a0 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20  st rSortCost;   
2c4b0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f        /* Cost to
2c4c0 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20   do a sort */.  
2c4d0 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
2c4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c4f0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
2c500 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
2c510 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
2c520 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
2c530 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2c540 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
2c550 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
2c560 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2c570 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
2c580 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
2c590 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
2c5a0 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
2c5b0 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
2c5c0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
2c5d0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
2c5e0 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
2c5f0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
2c600 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
2c610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2c620 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
2c630 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2c640 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2c650 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
2c660 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2c670 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
2c680 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
2c690 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
2c6a0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2c6b0 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
2c6c0 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
2c6d0 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
2c6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2c6f0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
2c700 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
2c710 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ne */..  pParse 
2c720 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2c730 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2c740 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
2c750 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2c760 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
2c770 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
2c780 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
2c790 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
2c7a0 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
2c7b0 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
2c7c0 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
2c7d0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
2c7e0 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
2c7f0 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
2c800 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
2c810 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
2c820 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a  (nLoop==1) ? 1 :
2c830 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
2c840 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
2c850 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
2c860 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2c870 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
2c880 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
2c890 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a  n solver\n"));..
2c8a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2c8b0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
2c8c0 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61  ce for aTo and a
2c8d0 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28  From */.  ii = (
2c8e0 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
2c8f0 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
2c900 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
2c910 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65  oice*2;.  pSpace
2c920 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2c930 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20  ocRaw(db, ii);. 
2c940 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
2c950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c960 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57  OMEM;.  aTo = (W
2c970 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
2c980 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
2c990 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
2c9a0 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
2c9b0 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
2c9c0 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
2c9d0 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
2c9e0 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
2c9f0 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
2ca00 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
2ca10 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
2ca20 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
2ca30 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
2ca40 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74    }..  /* Seed t
2ca50 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61  he search with a
2ca60 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74   single WherePat
2ca70 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72  h containing zer
2ca80 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20  o WhereLoops..  
2ca90 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20  **.  ** TUNING: 
2caa0 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e  Do not let the n
2cab0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
2cac0 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e  ons go above 25.
2cad0 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20    If the cost.  
2cae0 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ** of computing 
2caf0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
2cb00 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62  ex is not paid b
2cb10 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66  ack within the f
2cb20 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77  irst 25.  ** row
2cb30 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75  s, then do not u
2cb40 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  se the automatic
2cb50 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72   index. */.  aFr
2cb60 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e  om[0].nRow = MIN
2cb70 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  (pParse->nQueryL
2cb80 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72  oop, 46);  asser
2cb90 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
2cba0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46  gEst(25) );.  nF
2cbb0 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50  rom = 1;..  /* P
2cbc0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  recompute the co
2cbd0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
2cbe0 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73  e final result s
2cbf0 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65  et, if the calle
2cc00 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  r.  ** to sqlite
2cc10 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61  3WhereBegin() wa
2cc20 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  s concerned abou
2cc30 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72  t sorting */.  r
2cc40 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20  SortCost = 0;.  
2cc50 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
2cc60 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
2cc70 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72  st==0 ){.    aFr
2cc80 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56  om[0].isOrderedV
2cc90 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  alid = 1;.  }els
2cca0 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  e{.    /* TUNING
2ccb0 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
2ccc0 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 34   of sorting is 4
2ccd0 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  8*N*log2(N) wher
2cce0 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a  e N is the.    *
2ccf0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * number of outp
2cd00 75 74 20 72 6f 77 73 2e 20 54 68 65 20 34 38 20  ut rows. The 48 
2cd10 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
2cd20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 74 6f  size of a row to
2cd30 20 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20 46   sort. .    ** F
2cd40 49 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20 61  IXME:  compute a
2cd50 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65   better estimate
2cd60 20 6f 66 20 74 68 65 20 34 38 20 6d 75 6c 74 69   of the 48 multi
2cd70 70 6c 69 65 72 20 62 61 73 65 64 20 6f 6e 20 74  plier based on t
2cd80 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
2cd90 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
2cda0 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f  . */.    rSortCo
2cdb0 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65  st = nRowEst + e
2cdc0 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a  stLog(nRowEst);.
2cdd0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
2cde0 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74  x002,("---- sort
2cdf0 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72   cost=%-3d\n", r
2ce00 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a  SortCost));.  }.
2ce10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
2ce20 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
2ce30 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
2ce40 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
2ce50 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
2ce60 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
2ce70 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
2ce80 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
2ce90 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
2cea0 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
2ceb0 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
2cec0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
2ced0 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
2cee0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2cef0 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
2cf00 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
2cf10 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
2cf20 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
2cf30 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
2cf40 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
2cf50 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
2cf60 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
2cf70 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42  Loop){.        B
2cf80 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a  itmask maskNew;.
2cf90 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2cfa0 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  revMask = 0;.   
2cfb0 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
2cfc0 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e  dValid = pFrom->
2cfd0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a  isOrderedValid;.
2cfe0 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64          u8 isOrd
2cff0 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  ered = pFrom->is
2d000 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
2d010 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
2d020 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
2d030 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
2d040 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2d050 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
2d060 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
2d070 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
2d080 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2d090 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2d0a0 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
2d0b0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
2d0c0 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
2d0d0 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
2d0e0 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
2d0f0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
2d100 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
2d110 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
2d120 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
2d130 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
2d140 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
2d150 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74  3LogEstAdd(rCost
2d160 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
2d170 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
2d180 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
2d190 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
2d1a0 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
2d1b0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
2d1c0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2d1d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
2d1e0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b  sOrderedValid ){
2d1f0 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
2d200 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69  h( wherePathSati
2d210 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
2d220 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
2d230 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
2d240 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
2d250 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
2d260 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
2d290 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20  revMask) ){.    
2d2a0 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
2d2b0 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b   /* Yes.  pFrom+
2d2c0 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69  pWLoop does sati
2d2d0 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
2d2e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2d2f0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2d300 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
2d310 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2d320 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
2d330 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d340 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
2d350 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f  0:  /* No.  pFro
2d360 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65  m+pWLoop will re
2d370 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65  quire a separate
2d380 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20   sort */.       
2d390 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
2d3a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d3b0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
2d3c0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
2d3d0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
2d3e0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
2d3f0 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29  Cost, rSortCost)
2d400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d410 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2d420 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43     default: /* C
2d430 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20  annot tell yet. 
2d440 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68   Try again on th
2d450 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
2d460 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2d470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2d490 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2d4a0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2d4b0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
2d4c0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  }.        /* Che
2d4d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
2d4e0 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
2d4f0 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f  ded to the mxCho
2d500 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20  ice best so far 
2d510 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
2d520 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
2d530 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
2d540 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2d550 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
2d560 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20  =maskNew.       
2d570 20 20 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72      && pTo->isOr
2d580 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72  deredValid==isOr
2d590 64 65 72 65 64 56 61 6c 69 64 0a 20 20 20 20 20  deredValid.     
2d5a0 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e        && ((pTo->
2d5b0 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20  rCost<=rCost && 
2d5c0 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
2d5d0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2d5e0 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e      (pTo->rCost>
2d5f0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2d600 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20  Row>=nOut)).    
2d610 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2d620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2d630 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
2d640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d670 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
2d680 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
2d690 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74  xChoice && rCost
2d6a0 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64  >=mxCost ){.#ifd
2d6b0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2d6c0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
2d6d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d6e0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2d6f0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
2d700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2d710 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
2d720 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
2d730 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2d760 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
2d770 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
2d780 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
2d790 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
2d7a0 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
2d7b0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
2d7c0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
2d7d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d7e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2d7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d800 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
2d810 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65   new Path to the
2d820 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20   aTo[] set */.  
2d830 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
2d840 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
2d850 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
2d860 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2d870 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
2d880 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
2d890 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
2d8a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2d8c0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
2d8d0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
2d8e0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
2d8f0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
2d900 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
2d910 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
2d920 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
2d930 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
2d940 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2d950 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
2d960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2d970 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
2d980 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
2d990 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2d9a0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
2d9b0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
2d9c0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2d9e0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2d9f0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2da00 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
2da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2da20 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2da30 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2da40 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2da50 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2da60 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
2da70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2da80 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74  To->rCost<=rCost
2da90 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e   && pTo->nRow<=n
2daa0 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  Out ){.#ifdef WH
2dab0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2dac0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
2dad0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2dae0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
2daf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2db00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2db10 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
2db20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
2db30 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
2db40 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2db60 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
2db70 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
2db80 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
2dbb0 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
2dbc0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2dbd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2dbe0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2dbf0 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
2dc00 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
2dc10 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
2dc20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2dc30 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
2dc40 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
2dc50 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
2dc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc70 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
2dc80 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
2dc90 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
2dca0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
2dcb0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
2dcc0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
2dcd0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
2dce0 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
2dcf0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2dd00 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2dd10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2dd20 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
2dd30 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
2dd40 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
2dd50 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
2dd60 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
2dd70 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
2dd80 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
2dd90 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2dda0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
2ddb0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2ddc0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2ddd0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2dde0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ddf0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
2de00 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
2de10 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
2de20 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
2de30 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2de40 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
2de50 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
2de60 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
2de70 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2de80 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
2de90 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
2dea0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
2deb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dec0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77  DebugPrintf("  w
2ded0 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  as %s cost=%-3d,
2dee0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
2def0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2df00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
2df10 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
2df20 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
2df30 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
2df40 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
2df50 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
2df60 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
2df70 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
2df80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
2df90 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
2dfa0 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
2dfb0 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
2dfc0 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
2dfd0 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
2dfe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
2dff0 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
2e000 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
2e010 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2e020 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
2e030 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
2e040 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
2e050 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
2e060 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
2e070 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
2e080 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
2e090 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c  d = isOrderedVal
2e0a0 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  id;.        pTo-
2e0b0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
2e0c0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
2e0d0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
2e0e0 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
2e0f0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2e100 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
2e110 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
2e120 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
2e130 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
2e140 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
2e150 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a         mxI = 0;.
2e160 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
2e170 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
2e180 0a 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74  .          mxOut
2e190 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a   = aTo[0].nRow;.
2e1a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
2e1b0 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
2e1c0 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
2e1d0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
2e1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2e1f0 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  >rCost>mxCost ||
2e200 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
2e210 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
2e220 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20  w>mxOut) ){.    
2e230 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
2e240 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f               mxO
2e260 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a  ut = pTo->nRow;.
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
2e280 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
2e290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e2a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e2b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
2e2c0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2e2d0 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
2e2e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2e2f0 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a  hereTrace>=2 ){.
2e300 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e310 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
2e320 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
2e330 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
2e340 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
2e350 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
2e360 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
2e370 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2e380 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
2e390 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
2e3a0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
2e3b0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
2e3c0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
2e3d0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
2e3e0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
2e3f0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
2e400 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
2e410 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
2e420 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
2e430 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ?');.        if(
2e440 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
2e450 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f  alid && pTo->isO
2e460 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20  rdered ){.      
2e470 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2e480 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
2e490 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
2e4a0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
2e4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e4c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e4d0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
2e4e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e4f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2e500 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
2e510 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
2e520 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
2e530 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
2e540 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
2e550 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
2e560 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
2e570 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
2e580 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
2e590 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
2e5a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2e5b0 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
2e5c0 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
2e5d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2e5e0 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
2e5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2e600 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
2e610 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
2e620 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
2e630 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
2e640 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
2e650 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
2e660 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
2e670 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
2e680 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
2e690 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
2e6a0 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
2e6b0 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
2e6c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
2e6d0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
2e6e0 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
2e6f0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
2e700 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
2e710 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
2e720 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
2e730 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
2e740 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2e750 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
2e760 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
2e770 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
2e780 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
2e790 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
2e7a0 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
2e7b0 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
2e7c0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2e7d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2e7e0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2e7f0 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
2e800 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
2e810 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2e820 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2e830 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
2e840 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2e850 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2e860 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
2e870 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
2e880 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
2e890 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
2e8a0 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
2e8b0 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
2e8c0 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
2e8d0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2e8e0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
2e8f0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
2e900 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
2e910 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
2e920 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
2e930 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
2e940 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
2e950 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2e960 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  1 ) pWInfo->eDis
2e970 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2e980 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2e990 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d    }.  if( pFrom-
2e9a0 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
2e9b0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2e9c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e9d0 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
2e9e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2e9f0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2ea00 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
2ea10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ea20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74    pWInfo->bOBSat
2ea30 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e   = 1;.      pWIn
2ea40 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
2ea50 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
2ea60 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f    }.  }.  pWInfo
2ea70 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
2ea80 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
2ea90 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
2eaa0 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
2eab0 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
2eac0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2ead0 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
2eae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2eaf0 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65  *.** Most querie
2eb00 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e  s use only a sin
2eb10 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20  gle table (they 
2eb20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61  are not joins) a
2eb30 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c  nd have.** simpl
2eb40 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
2eb50 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64   against indexed
2eb60 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72   fields.  This r
2eb70 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a  outine attempts.
2eb80 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65  ** to plan those
2eb90 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73   simple cases us
2eba0 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65  ing much less ce
2ebb0 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a  remony than the.
2ebc0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
2ebd0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
2ebe0 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69  , and thereby yi
2ebf0 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74  eld faster sqlit
2ec00 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20  e3_prepare().** 
2ec10 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f  times for the co
2ec20 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  mmon case..**.**
2ec30 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2ec40 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20   on success, if 
2ec50 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
2ec60 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
2ec70 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71  s.** no-frills q
2ec80 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52  uery planner.  R
2ec90 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68  eturn zero if th
2eca0 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74  is query needs t
2ecb0 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  he .** general-p
2ecc0 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
2ecd0 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nner..*/.static 
2ece0 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75  int whereShortCu
2ecf0 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
2ed00 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
2ed10 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2ed20 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  fo;.  struct Src
2ed30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2ed40 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
2ed50 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72  *pWC;.  WhereTer
2ed60 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72  m *pTerm;.  Wher
2ed70 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
2ed80 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
2ed90 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  j;.  Table *pTab
2eda0 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
2edb0 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  .  .  pWInfo = p
2edc0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2edd0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
2ede0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2edf0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20  E_FORCE_TABLE ) 
2ee00 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
2ee10 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
2ee20 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
2ee30 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
2ee40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
2ee50 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
2ee60 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
2ee70 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
2ee80 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
2ee90 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65  tem->zIndex ) re
2eea0 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
2eeb0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
2eec0 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
2eed0 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
2eee0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2eef0 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
2ef00 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  s = 0;.  pLoop->
2ef10 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
2ef20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  0;.  pTerm = fin
2ef30 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
2ef40 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30   -1, 0, WO_EQ, 0
2ef50 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
2ef60 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  {.    pLoop->wsF
2ef70 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
2ef80 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
2ef90 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
2efa0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
2efb0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2efc0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
2efd0 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
2efe0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
2eff0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2f000 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
2f010 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
2f020 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
2f030 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
2f040 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
2f050 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
2f060 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
2f070 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
2f080 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
2f090 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2f0a0 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
2f0b0 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
2f0c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f0d0 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
2f0e0 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34  >aLTermSpace)==4
2f0f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
2f100 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
2f110 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20  None .       || 
2f120 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
2f130 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
2f140 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  | pIdx->nKeyCol>
2f150 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
2f160 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
2f170 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
2f180 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2f190 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
2f1a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
2f1b0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2f1c0 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
2f1d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
2f1e0 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20   WO_EQ, pIdx);. 
2f1f0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
2f200 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2f210 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
2f220 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
2f230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f240 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   j!=pIdx->nKeyCo
2f250 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
2f260 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
2f270 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
2f280 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
2f290 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
2f2a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
2f2b0 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28  >isCovering || (
2f2c0 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
2f2d0 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
2f2e0 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
2f2f0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
2f300 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
2f310 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
2f320 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
2f330 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
2f340 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2f350 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
2f360 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2f370 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
2f380 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
2f390 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
2f3a0 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
2f3b0 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
2f3c0 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
2f3d0 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
2f3e0 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
2f3f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2f400 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2f410 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
2f420 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
2f430 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
2f440 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
2f450 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  oop;.    pLoop->
2f460 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
2f470 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
2f480 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20  kSet, iCur);.   
2f490 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54   pWInfo->a[0].iT
2f4a0 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
2f4b0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2f4c0 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  t = 1;.    if( p
2f4d0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2f4e0 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74  ) pWInfo->bOBSat
2f4f0 20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70   =  1;.    if( p
2f500 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2f510 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2f520 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
2f530 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2f540 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2f550 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
2f560 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2f570 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
2f580 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
2f590 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
2f5a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2f5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2f5c0 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
2f5d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
2f5e0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
2f5f0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
2f600 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f610 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
2f620 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
2f630 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
2f640 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
2f650 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
2f660 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
2f670 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
2f680 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
2f690 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
2f6a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2f6b0 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
2f6c0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
2f6d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
2f6e0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
2f6f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2f700 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
2f710 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2f720 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
2f730 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
2f740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
2f750 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
2f760 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
2f770 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
2f780 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
2f790 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2f7a0 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
2f7b0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
2f7c0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
2f7d0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
2f7e0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
2f7f0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2f800 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2f810 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
2f820 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
2f830 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
2f840 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2f850 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
2f860 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
2f870 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
2f880 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
2f890 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
2f8a0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2f8b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2f8c0 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
2f8d0 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
2f8e0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
2f8f0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
2f900 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
2f910 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f920 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
2f930 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
2f940 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
2f950 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
2f960 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f980 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
2f990 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
2f9a0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2f9b0 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
2f9c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2f9d0 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9f0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
2fa00 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
2fa10 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
2fa20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
2fa30 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
2fa40 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
2fa50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2fa60 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
2fa70 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
2fa80 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
2fa90 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
2faa0 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
2fab0 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
2fac0 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
2fad0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2fae0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
2faf0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
2fb00 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
2fb10 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
2fb20 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
2fb30 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
2fb40 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
2fb50 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
2fb60 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
2fb70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2fb80 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
2fb90 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
2fba0 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
2fbb0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
2fbc0 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
2fbd0 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
2fbe0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
2fbf0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
2fc00 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
2fc10 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
2fc20 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
2fc30 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
2fc40 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
2fc50 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
2fc60 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
2fc70 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
2fc80 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
2fc90 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
2fca0 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
2fcb0 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
2fcc0 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
2fcd0 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
2fce0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
2fcf0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
2fd00 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
2fd10 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
2fd20 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
2fd30 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
2fd40 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
2fd50 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
2fd60 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
2fd70 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
2fd80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
2fd90 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
2fda0 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
2fdb0 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
2fdc0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
2fdd0 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
2fde0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
2fdf0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
2fe00 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
2fe10 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
2fe20 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
2fe30 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
2fe40 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
2fe50 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
2fe60 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
2fe70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
2fe80 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
2fe90 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
2fea0 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
2feb0 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
2fec0 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
2fed0 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
2fee0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
2fef0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
2ff00 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
2ff10 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
2ff20 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
2ff30 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2ff40 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
2ff50 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
2ff60 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
2ff70 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
2ff80 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
2ff90 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
2ffa0 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
2ffb0 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
2ffc0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2ffd0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2ffe0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
2fff0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
30000 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
30010 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
30020 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
30030 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
30040 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
30050 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
30060 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
30070 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
30080 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
30090 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
300a0 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
300b0 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
300c0 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
300d0 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
300e0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
300f0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
30100 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
30110 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
30120 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
30130 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
30140 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
30150 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
30160 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
30170 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
30180 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
30190 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
301a0 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
301b0 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
301c0 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
301d0 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
301e0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
301f0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
30200 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
30210 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
30220 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
30230 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
30240 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
30250 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
30260 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
30270 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
30280 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
30290 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
302a0 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
302b0 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
302c0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
302d0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
302e0 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
302f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
30300 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
30310 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
30320 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
30330 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
30340 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
30350 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
30360 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
30370 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
30380 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
30390 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
303a0 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73   set, iIdxCur is
303b0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
303c0 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  er of an index.*
303d0 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20  * to use for OR 
303e0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
303f0 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c  g.  The WHERE cl
30400 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20  ause should use 
30410 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63  this.** specific
30420 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45   cursor.  If WHE
30430 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
30440 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ED is set, then 
30450 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68  iIdxCur is.** th
30460 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69  e first cursor i
30470 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75  n an array of cu
30480 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
30490 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20  dices.  iIdxCur 
304a0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65  should.** be use
304b0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
304c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72   appropriate cur
304d0 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  sor depending on
304e0 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a   which index is.
304f0 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72  ** used..*/.Wher
30500 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
30510 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
30520 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
30530 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
30540 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
30550 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
30560 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
30570 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  e: A list of all
30580 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
30590 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
305a0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
305b0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
305c0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
305d0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
305e0 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63  /* An ORDER BY c
305f0 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
30600 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
30610 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
30620 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
30630 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
30640 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
30650 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
30660 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
30670 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
30680 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
30690 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
306a0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
306b0 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
306c0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
306d0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
306e0 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
306f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
30700 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
30710 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
30720 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
30730 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
30740 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30750 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
30760 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
30770 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
30780 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
30790 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
307a0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
307b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
307c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
307d0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
307e0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
307f0 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
30800 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
30810 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
30820 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
30830 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
30840 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
30850 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
30860 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
30870 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
30880 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
30890 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
308a0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
308b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
308c0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
308d0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
308e0 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
308f0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
30900 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
30910 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
30920 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
30930 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
30940 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
30950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
30960 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
30970 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
30980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
30990 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
309a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
309d0 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
309e0 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
309f0 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
30a00 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
30a10 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
30a20 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42  f(sWLB));.  sWLB
30a30 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
30a40 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61  erBy;..  /* Disa
30a50 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ble the DISTINCT
30a60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
30a70 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
30a80 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20  Opt is set via. 
30a90 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
30aa0 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53  _ctrl(SQLITE_TES
30ab0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
30ac0 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66  ONS,...) */.  if
30ad0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
30ae0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
30af0 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29  E_DistinctOpt) )
30b00 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  {.    wctrlFlags
30b10 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f   &= ~WHERE_WANT_
30b20 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20  DISTINCT;.  }.. 
30b30 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
30b40 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
30b50 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
30b60 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
30b70 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
30b80 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
30b90 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
30ba0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
30bb0 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54  =BMS );.  if( pT
30bc0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
30bd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
30be0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
30bf0 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
30c00 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
30c10 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
30c20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  0;.  }..  /* Thi
30c30 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61  s function norma
30c40 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20  lly generates a 
30c50 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20  nested loop for 
30c60 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20  all tables in . 
30c70 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42   ** pTabList.  B
30c80 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ut if the WHERE_
30c90 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
30ca0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
30cb0 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f  we should.  ** o
30cc0 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64  nly generate cod
30cd0 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  e for the first 
30ce0 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
30cf0 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61  t and assume tha
30d00 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f  t.  ** any curso
30d10 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
30d20 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61  th subsequent ta
30d30 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69  bles are uniniti
30d40 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e  alized..  */.  n
30d50 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c  TabList = (wctrl
30d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
30d70 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31  ETABLE_ONLY) ? 1
30d80 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
30d90 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
30da0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
30db0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
30dc0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
30dd0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
30de0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
30df0 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
30e00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
30e10 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
30e20 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
30e30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30e40 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
30e50 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
30e60 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
30e70 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
30e80 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
30e90 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
30ea0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
30eb0 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
30ec0 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
30ed0 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
30ee0 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
30ef0 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
30f00 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
30f10 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
30f20 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
30f30 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
30f40 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
30f50 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
30f60 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
30f70 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
30f80 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
30f90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
30fa0 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65  ByteWInfo + size
30fb0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
30fc0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
30fd0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
30fe0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30ff0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
31000 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
31010 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
31020 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
31030 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
31040 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72   = pWInfo->aiCur
31050 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b  OnePass[1] = -1;
31060 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
31070 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
31080 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
31090 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
310a0 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
310b0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
310c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
310d0 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
310e0 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
310f0 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
31100 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
31110 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
31120 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
31130 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
31140 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
31150 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
31160 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
31170 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
31180 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
31190 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
311a0 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
311b0 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
311c0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
311d0 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
311e0 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70  Loop*)(((char*)p
311f0 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66  WInfo)+nByteWInf
31200 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  o);.  assert( EI
31210 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
31220 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b  NT(sWLB.pNew) );
31230 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
31240 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
31250 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
31260 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
31270 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
31280 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
31290 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
312a0 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
312b0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
312c0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
312d0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
312e0 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
312f0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
31300 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
31310 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
31320 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
31330 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
31340 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57    whereSplit(&pW
31350 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
31360 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71  e, TK_AND);.  sq
31370 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
31380 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
31390 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
313a0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
313b0 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20   Goto */.    .  
313c0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
313d0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
313e0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
313f0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
31400 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
31410 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
31420 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
31430 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
31440 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
31450 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
31460 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
31470 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
31480 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
31490 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
314a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
314b0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
314c0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
314d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
314e0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
314f0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
31500 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
31510 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
31520 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
31530 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
31540 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
31550 20 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72   1;.    if( wctr
31560 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
31570 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
31580 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
31590 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
315a0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
315b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
315c0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
315d0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
315e0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
315f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
31600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
31610 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
31620 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
31630 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
31640 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
31650 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
31660 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
31670 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
31680 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
31690 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
316a0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
316b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
316c0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
316d0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
316e0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
316f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
31700 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
31710 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
31720 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
31730 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
31740 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
31750 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
31760 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
31770 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
31780 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
31790 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
317a0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
317b0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
317c0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
317d0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
317e0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
317f0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
31800 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
31810 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
31820 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
31830 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
31840 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
31850 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
31860 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
31870 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
31880 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
31890 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
318a0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
318b0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
318c0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
318d0 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
318e0 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
318f0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
31900 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
31910 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
31920 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
31930 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
31940 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
31950 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
31960 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
31970 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
31980 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
31990 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
319a0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
319b0 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
319c0 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
319d0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
319e0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
319f0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
31a00 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
31a10 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
31a20 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
31a30 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
31a40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
31a50 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
31a60 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
31a70 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
31a80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
31a90 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
31aa0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
31ab0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
31ac0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
31ad0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
31ae0 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
31af0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
31b00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
31b10 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
31b20 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
31b30 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
31b40 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
31b50 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
31b60 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
31b70 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
31b80 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
31b90 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
31ba0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
31bb0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
31bc0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
31bd0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
31be0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31bf0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
31c00 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
31c10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
31c20 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
31c30 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e  P BY) clause con
31c40 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
31c50 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a   to general.  **
31c60 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
31c70 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61  en we won't be a
31c80 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69  ble to satisfy i
31c90 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c  t using indices,
31ca0 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61   so.  ** go ahea
31cb0 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74  d and disable it
31cc0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
31cd0 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63   pOrderBy && (wc
31ce0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31cf0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
31d00 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  =0 ){.    for(ii
31d10 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
31d20 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
31d30 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
31d40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
31d50 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
31d60 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
31d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
31d80 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
31d90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
31da0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
31db0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
31dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
31de0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
31df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31e10 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
31e20 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
31e30 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
31e40 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
31e50 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
31e60 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
31e70 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
31e80 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
31e90 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
31ea0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
31eb0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
31ec0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
31ed0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
31ee0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
31ef0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
31f00 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
31f10 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
31f20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
31f30 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
31f40 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
31f50 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
31f60 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
31f70 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
31f80 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
31f90 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
31fa0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
31fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31fc0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
31fd0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
31fe0 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
31ff0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
32000 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
32010 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73  *\n"));.  /* Dis
32020 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
32030 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
32040 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  se */.#if define
32050 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
32060 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
32070 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
32080 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69  REE_EXPLAIN).  i
32090 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
320a0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
320b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
320c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
320d0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
320e0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
320f0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
32100 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   i<sWLB.pWC->nTe
32110 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
32120 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
32130 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22  intf(v, "#%-2d "
32140 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
32150 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76  te3ExplainPush(v
32160 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78  );.      whereEx
32170 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57  plainTerm(v, &sW
32180 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20  LB.pWC->a[i]);. 
32190 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
321a0 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
321b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
321c0 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
321d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
321e0 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
321f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32200 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
32210 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
32220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
32230 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
32240 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
32250 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
32260 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
32270 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
32280 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32290 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
322a0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
322b0 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
322c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
322d0 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
322e0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
322f0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
32300 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
32310 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
32320 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
32330 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
32340 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
32350 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
32360 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
32370 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
32380 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
32390 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
323c0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
323d0 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
323e0 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
323f0 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
32400 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
32410 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
32420 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
32430 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
32440 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
32450 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
32460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32470 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
32480 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
32490 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
324a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
324b0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
324c0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
324d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
324e0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
324f0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
32500 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
32510 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
32520 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32530 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
32540 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
32550 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
32560 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
32570 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
32580 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
32590 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
325a0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
325b0 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
325c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
325d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
325e0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
325f0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
32600 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
32610 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
32620 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
32630 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73  * !=0 */.  if( s
32640 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32650 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
32660 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32670 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
32680 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
32690 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
326a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
326b0 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->bOBSat ){.    
326c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
326d0 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30  intf(" ORDERBY=0
326e0 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
326f0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
32700 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
32710 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
32720 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
32730 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
32740 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
32750 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32760 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
32770 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
32780 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32790 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
327a0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
327b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
327c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
327d0 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
327e0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
327f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
32800 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
32810 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
32820 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32830 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
32840 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
32850 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
32860 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32870 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
32880 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
32890 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
328a0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
328b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
328c0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
328d0 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
328e0 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  op, sWLB.pWC);. 
328f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32900 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
32910 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
32920 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
32930 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
32940 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
32950 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
32960 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
32970 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
32980 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
32990 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
329a0 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
329b0 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
329c0 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ed = exprListTab
329d0 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
329e0 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
329f0 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
32a00 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c  erBy ) tabUsed |
32a10 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
32a20 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73  sage(pMaskSet, s
32a30 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  WLB.pOrderBy);. 
32a40 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
32a50 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
32a60 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
32a70 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
32a80 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
32a90 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
32aa0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
32ab0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
32ac0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
32ad0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e  Loop->iTab].join
32ae0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
32af0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
32b00 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
32b10 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
32b20 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
32b30 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
32b40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
32b50 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
32b60 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
32b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32b80 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
32b90 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
32ba0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
32bb0 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
32bc0 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
32bd0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
32be0 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
32bf0 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
32c00 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
32c10 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
32c20 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
32c30 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
32c40 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
32c50 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
32c60 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
32c70 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
32c80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
32c90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32ca0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
32cb0 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
32cc0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
32cd0 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
32ce0 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
32cf0 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
32d00 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
32d10 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
32d20 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
32d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
32d40 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
32d50 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
32d60 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
32d70 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
32d80 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
32d90 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
32da0 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
32db0 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
32dc0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
32dd0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
32de0 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
32df0 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
32e00 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
32e10 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
32e20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
32e30 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
32e40 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
32e50 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
32e60 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
32e70 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73  rains.  ** the s
32e80 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
32e90 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
32ea0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
32eb0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
32ec0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
32ed0 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
32ee0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
32ef0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
32f00 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
32f10 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
32f20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b    && (pWInfo->a[
32f30 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
32f40 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
32f50 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  W)!=0 ){.    pWI
32f60 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
32f70 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52   1;.    if( HasR
32f80 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61  owid(pTabList->a
32f90 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
32fa0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
32fb0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
32fc0 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
32fd0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LY;.    }.  }.. 
32fe0 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
32ff0 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
33000 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
33010 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
33020 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
33030 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
33040 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
33050 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
33060 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
33070 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
33080 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
33090 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
330a0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
330b0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
330c0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
330d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
330e0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
330f0 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
33100 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
33110 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33120 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
33130 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
33140 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
33150 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
33160 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
33170 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
33180 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
33190 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
331a0 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
331b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
331c0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
331d0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
331e0 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
331f0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
33200 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
33210 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
33220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33230 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
33240 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
33250 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
33260 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
33270 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
33280 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
33290 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
332a0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
332b0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
332c0 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
332d0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
332e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
332f0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
33300 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
33310 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
33320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
33330 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
33340 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
33350 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
33360 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
33370 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
33380 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
33390 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
333a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
333b0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
333c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
333d0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
333e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
333f0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b  fo->okOnePass ){
33400 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
33410 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
33420 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
33430 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54  rOnePass[0] = pT
33440 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
33450 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
33460 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
33470 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
33480 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
33490 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
334a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
334b0 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65  em->iCursor==pLe
334c0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a  vel->iTabCur );.
334d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
334e0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
334f0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
33500 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
33510 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
33520 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
33530 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
33540 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
33550 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
33560 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
33570 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  MS && HasRowid(p
33580 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
33590 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
335a0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
335b0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
335c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
335d0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
335e0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
335f0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
33600 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33610 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
33640 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
33650 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
33660 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
33670 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
33680 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
33690 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
336a0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
336b0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
336c0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
336d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
336e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
336f0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
33700 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
33710 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
33720 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
33730 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a   int iIndexCur;.
33740 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
33750 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
33760 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20    /* iIdxCur is 
33770 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74 6f  always set if to
33780 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
33790 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20  e if ONEPASS is 
337a0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20  possible */.    
337b0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75    assert( iIdxCu
337c0 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d  r!=0 || (pWInfo-
337d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
337e0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
337f0 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  RED)==0 );.     
33800 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f   if( pWInfo->okO
33810 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20  nePass ){.      
33820 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54    Index *pJ = pT
33830 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49  abItem->pTab->pI
33840 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49  ndex;.        iI
33850 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75  ndexCur = iIdxCu
33860 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
33870 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  t( wctrlFlags & 
33880 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
33890 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  SIRED );.       
338a0 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
338b0 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b  J) && pJ!=pIx ){
338c0 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65  .          iInde
338d0 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  xCur++;.        
338e0 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74    pJ = pJ->pNext
338f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33900 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
33910 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
33920 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
33930 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43  ass[1] = iIndexC
33940 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ur;.      }else 
33950 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20 28  if( iIdxCur && (
33960 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33970 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
33980 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
33990 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78  iIndexCur = iIdx
339a0 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
339b0 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
339c0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
339d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
339e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
339f0 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
33a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33a10 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
33a20 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
33a30 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
33a40 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
33a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33a60 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
33a70 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
33a80 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
33a90 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
33aa0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
33ab0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
33ac0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
33ad0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
33ae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
33af0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
33b00 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
33b10 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
33b20 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
33b30 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
33b40 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  m->iCursor);.  }
33b50 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
33b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33b70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
33b80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
33b90 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
33ba0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
33bb0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
33bc0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
33bd0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
33be0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
33bf0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
33c00 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
33c10 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
33c20 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
33c30 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
33c40 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
33c50 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
33c60 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
33c70 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
33c80 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
33c90 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66  Info->a[ii];.#if
33ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33cb0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
33cc0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
33cd0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
33ce0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
33cf0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
33d00 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
33d10 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
33d20 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a  , &pWInfo->sWC,.
33d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d40 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
33d50 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74  vel->iFrom], not
33d60 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
33d70 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
33d80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
33d90 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
33da0 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  r;.    }.#endif.
33db0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
33dc0 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
33dd0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
33de0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
33df0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
33e00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
33e10 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
33e20 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
33e30 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f     notReady = co
33e40 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
33e50 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
33e60 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
33e70 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
33e80 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
33e90 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
33ea0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
33eb0 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
33ec0 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
33ed0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
33ee0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
33ef0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
33f00 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
33f10 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
33f20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
33f30 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
33f40 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
33f50 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
33f60 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
33f70 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
33f80 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
33f90 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
33fa0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
33fb0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
33fc0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
33fd0 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
33fe0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
33ff0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
34000 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
34010 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
34020 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
34030 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
34040 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
34050 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
34060 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
34070 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
34080 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
34090 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  p;.  SrcList *pT
340a0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
340b0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
340c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
340d0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
340e0 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
340f0 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
34100 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
34110 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
34120 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71  RE-core"));.  sq
34130 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
34140 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
34150 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
34160 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  vel-1; i>=0; i--
34170 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
34180 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
34190 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
341a0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
341b0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
341c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
341d0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
341e0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
341f0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
34200 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
34210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34220 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
34230 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
34240 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
34250 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
34260 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
34270 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
34280 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
34290 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
342a0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
342b0 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
342c0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
342d0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
342e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
342f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
34300 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
34310 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
34320 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
34330 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
34340 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
34350 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
34360 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
34370 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
34380 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
34390 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
343a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
343b0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
343c0 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
343d0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
343e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
343f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
34400 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
34410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34420 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
34430 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
34440 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
34450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
34460 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
34470 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
34480 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
34490 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20  addrSkip ){.    
344a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
344b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
344c0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  0, pLevel->addrS
344d0 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
344e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
344f0 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
34500 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
34510 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
34520 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34530 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34540 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
34550 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
34560 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34570 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
34580 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p-2);.    }.    
34590 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
345a0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61  tJoin ){.      a
345b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
345c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
345d0 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
345e0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
345f0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
34600 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
34610 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
34620 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70         || (pLoop
34630 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
34640 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
34650 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
34660 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34670 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
34680 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34690 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
346a0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
346b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
346c0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
346d0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
346e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
346f0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20  DEXED ){.       
34700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34710 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
34720 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
34730 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
34740 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
34750 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
34760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34770 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34780 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
34790 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
347a0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
347b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
347c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
347d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
347e0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
347f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
34800 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
34810 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
34820 7d 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  }.    VdbeNoopCo
34830 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
34840 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
34850 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
34860 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
34870 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
34880 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61  evel->iFrom].pTa
34890 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  b->zName));.  }.
348a0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
348b0 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
348c0 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
348d0 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
348e0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
348f0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
34900 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34910 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
34920 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  eak);..  assert(
34930 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c   pWInfo->nLevel<
34940 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
34950 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
34960 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
34970 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
34980 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
34990 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
349a0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
349b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
349c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
349d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
349e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
349f0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
34a00 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
34a10 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
34a20 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
34a30 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
34a40 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
34a50 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
34a60 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
34a70 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
34a80 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  gin..    ** Exce
34a90 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  pt, do not close
34aa0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69   cursors that wi
34ab0 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20  ll be reused by 
34ac0 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
34ad0 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52  ion.    ** (WHER
34ae0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
34af0 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20  E).  And do not 
34b00 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65  close the OP_Ope
34b10 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20  nWrite cursors. 
34b20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
34b30 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70  r the ONEPASS op
34b40 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
34b50 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  */.    if( (pTab
34b60 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
34b70 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20  Ephemeral)==0.  
34b80 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c     && pTab->pSel
34b90 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ect==0.     && (
34ba0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
34bb0 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
34bc0 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20  OPEN_CLOSE)==0. 
34bd0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20     ){.      int 
34be0 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
34bf0 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ags;.      if( !
34c00 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
34c10 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  s && (ws & WHERE
34c20 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
34c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34c40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34c50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
34c60 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
34c70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
34c80 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
34c90 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
34ca0 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  (ws & (WHERE_IPK
34cb0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
34cc0 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26  X))==0 .       &
34cd0 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  & pLevel->iIdxCu
34ce0 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r!=pWInfo->aiCur
34cf0 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20  OnePass[1].     
34d00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34d10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34d20 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
34d30 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
34d40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
34d50 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
34d60 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
34d70 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75  ake VDBE code su
34d80 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
34d90 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
34da0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
34db0 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74  nstead of from t
34dc0 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70  he table where p
34dd0 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d  ossible.  In som
34de0 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74  e cases.    ** t
34df0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
34e00 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61   prevents the ta
34e10 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65  ble from ever be
34e20 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20  ing read, which 
34e30 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64  can.    ** yield
34e40 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70   a significant p
34e50 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
34e60 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
34e70 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
34e80 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
34e90 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
34ea0 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
34eb0 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
34ec0 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
34ed0 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
34ee0 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
34ef0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
34f00 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
34f10 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
34f20 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
34f30 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
34f40 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
34f50 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
34f60 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
34f70 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
34f80 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
34f90 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
34fa0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
34fb0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
34fc0 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49  _INDEXED|WHERE_I
34fd0 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
34fe0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
34ff0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
35000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
35010 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
35020 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
35030 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
35040 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b  evel->u.pCovidx;
35050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
35060 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Idx && !db->mall
35070 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
35080 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20    int k, last;. 
35090 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
350a0 3b 0a 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  ;..      last = 
350b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
350c0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
350d0 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64   k = pLevel->add
350e0 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70  rBody;.      pOp
350f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
35100 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20  tOp(v, k);.     
35110 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b   for(; k<last; k
35120 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
35130 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
35140 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
35150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35160 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
35170 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
35180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
35190 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20   x = pOp->p2;.  
351a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
351b0 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54  pIdx->pTable==pT
351c0 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab );.          
351d0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
351e0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
351f0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
35200 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
35210 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
35220 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50            x = pP
35230 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a  k->aiColumn[x];.
35240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35250 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
35260 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
35270 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  Idx, x);.       
35280 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
35290 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
352a0 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  p2 = x;.        
352b0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
352c0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
352d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
352e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
352f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
35300 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
35310 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20  0 || x>=0 );.   
35320 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
35330 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
35340 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
35350 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
35360 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
35370 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
35380 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
35390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
353a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
353b0 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
353c0 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
353d0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
353e0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
353f0 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
35400 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
35410 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.